红宝石如何用“<<”来定义写作者的方法

我有一个骨架类:

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

上一篇: ruby how to define writer method with "<<"

下一篇: Ruby access to symbol "invoked by"