如何将语法糖添加到类似于集合的rails

时间:2012-03-15 21:51:30

标签: ruby-on-rails ruby syntax syntactic-sugar

如何添加类似于rails的语法糖“添加到集合”<<运营商,即

@object.collection << item

我正在尝试

class Object
  def collection<<(item)
    ...
  end
end

但它不起作用。我可以选择在属性上定义自己的“运算符”。

注意 - 我知道使用def <<(value)很热,但它适用于整个对象而不是其属性。

3 个答案:

答案 0 :(得分:3)

@object.collection << item

让我们把它分开。

  • @object - 好吧,有些对象。
  • collection - 发送@object时 这条消息会返回一些东西。
  • << - 此消息将发送给 从collection消息返回的对象。
  • item - <<消息的参数。

实施例

class Foo
  def << val
    puts "someone pushed #{val} to me"
  end
end

class Bar
  def collection
    @foo ||= Foo.new
  end
end

b = Bar.new

b.collection << 'item'
# someone pushed item to me

顺便说一句,这些形式做同样的事情并产生相同的输出。

b.collection << 'item'
b.send(:collection).send(:<<, 'item')
b.collection.<<('item')
b.collection.<< 'item'

答案 1 :(得分:1)

根据Ruby的工作原理,这是不可能的。您需要使用集合方法返回一个对象,该对象具有自定义<<方法。

答案 2 :(得分:0)

<<Array的方法,因此这适用于纯Ruby:

def MyClass
  def initialize
    @collection = []
  end
  def collection
    @collection
  end
end

MyClass.new.collection << 'foo'