红宝石如何用“<<”来定义写作者的方法
我有一个骨架类:
class Foo
def bar
# returns some sort of array
end
end
但是如何将'writer'方法添加到'bar'以启用Array#推送行为?
Foo.new.bar<<['Smile']
_.bar #=> ['Smile']
编辑:我应该进一步扩展我的问题。 有两个类。 Foo和Bar,非常像ActiveRecord has_many关系,其中Foo has_many Bars
但我实际上是在Foo的一个方法里存储Bar的id。 我将该方法命名为bar_ids
所以@foo = Foo.new(:bar_ids => [1,2,3])
正如你可以想象的,如果我想查看酒吧属于@foo,我必须实际上做一些像Bar.where(:id => @ foo.bar_ids)
所以我决定让另一个刚刚命名为bar的方法来做那个类Foo#... def bar Bar.where(:id => bar_ids)end end
这解决了。 现在我可以做@ foo.bar#=>属于@foo的所有酒吧
现在我也想拥有像ActiveRecord关联那样的推式方法,只是为了在将另一个bar对象关联到foo对象时切除“id”类型
目前,这可以工作:@ foo.bar_ids << Bar.new.id @ foo.save
但是我想要:@ foo.bar << Bar.new#其中,新酒吧的ID将被推入@foo @ foo.save的bar_ids方法中
感谢您的帮助,我非常感谢您对此的看法!
class Foo
attr_reader :bar
def initialize
@bar = Array.new
def @bar.<< arg
self.push arg.id
end
end
end
class Bar
attr_accessor :id
def initialize id
self.id = id
end
end
f = Foo.new
bars = (1..5).map{|i| Bar.new i}
f.bar << bars[2]
f.bar << bars[4]
p f.bar #=> [3, 5]
返回已定义<<
方法的对象。
除非我误解你想要的东西,为什么不直接让bar
方法成为内部数组成员的getter?
class Foo
attr_reader :bar
def initialize
@bar = []
end
end
f = Foo.new
f.bar << 'abc'
# f.bar => ['abc']
链接地址: http://www.djcxy.com/p/95427.html