ruby如何使用“<<”定义编写器方法

时间:2010-09-20 14:05:25

标签: ruby

我有一个骨架类:

class Foo
   def bar
    # returns some sort of array
   end
end

但是如何将'writer'方法添加到'bar'以便启用Array#push行为?

Foo.new.bar<<['Smile']
_.bar #=> ['Smile']

EDITED: 我应该进一步扩展我的问题。 有两个班。 Foo和Bar,很像ActiveRecord has_many关系,其中Foo has_many Bars

但实际上我将Bar的id存储在Foo的方法中。我将该方法命名为bar_ids

所以@foo = Foo.new(:bar_ids =&gt; [1,2,3])

你可以想象,如果我想查看Bars属于@foo,我必须实际做一些像Bar.where(:id =&gt; @ foo.bar_ids)

所以我决定制作另一个名为bar的方法来做到这一点     Foo级         #...         def吧           Bar.where(:id =&gt; bar_ids)         结束     端

结果证明了这一点。现在我可以做@ foo.bar#=&gt;所有属于@foo的栏目

现在我也想拥有像ActiveRecord关联那样的推送方法,只是为了在将另一个bar对象与foo对象关联时删除“id”类型

目前,这有效:     @ foo.bar_ids&lt;&lt; Bar.new.id     @ foo.save

但我想要:     @ foo.bar&lt;&lt; Bar.new #where新条形码的id将被推送到@foo的bar_ids方法中     @ foo.save

感谢您的所有帮助,我非常感谢您对此的看法!

3 个答案:

答案 0 :(得分:2)

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]

答案 1 :(得分:1)

返回定义了<<方法的对象。

答案 2 :(得分:0)

除非我误解了你想要的东西,为什么不让bar方法成为内部数组成员的getter?

class Foo
  attr_reader :bar

  def initialize
    @bar = []
  end
end

f = Foo.new
f.bar << 'abc'
# f.bar => ['abc']