как добавить синтаксический сахар в рельсы, похожие на коллекции - PullRequest
0 голосов
/ 16 марта 2012

Как можно добавить синтаксический сахар, похожий на рельсы, оператор «добавить в коллекцию» <<, т.е. </p>

@object.collection << item

Я пытался сделать

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

, но это не работает,При желании я хотел бы определить свои собственные «операторы» для атрибутов.

Примечание. Я знаю, что использовать def <<(value) очень полезно, но он работает для всего объекта, а не для его атрибута.

Ответы [ 3 ]

3 голосов
/ 16 марта 2012
@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 голос
/ 16 марта 2012

Это невозможно из-за того, как работает Ruby. Вам понадобится ваш метод коллекции, чтобы вернуть объект, на котором есть ваш собственный метод <<.

0 голосов
/ 16 марта 2012

<< - это метод Array, поэтому он работает в простом Ruby:

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

MyClass.new.collection << 'foo'
...