Почему Enumerator.new требует объект "урожай"? - PullRequest
5 голосов
/ 27 декабря 2011

Рассмотрим простой перечислитель, подобный этому:

natural_numbers = Enumerator.new do |yielder|
  number = 1
  loop do
    yielder.yield number
    number += 1
  end
end

Мой вопрос таков: почему ruby ​​требует, чтобы мы вызывали yield для объекта урожайности? Сказал по-другому: почему мы не можем заменить yielder.yield number на yield number? В этом примере, казалось бы, было бы то же самое, если бы это было разрешено. Существуют ли примеры, где урожай используется нетривиальным образом? Если да, можете ли вы дать один? Если нет, то какова цель урожая?

Спасибо.

1 Ответ

3 голосов
/ 27 декабря 2011

Не на 100% уверен, что в этом причина, но только yield относится (всегда) к блоку, переданному методу, вызывающему yield: в вашем случае метод, содержащий присваивание natural_numbers;и он не может выполнить то, что требуется для Enumerator, то есть испустить элемент Enumerator.Хотя имя с таким же именем Yielder#yield является методом, а Ruby's yield является оператором.

Другими словами, невозможно реализовать конструктор Enumerator, которыйбудет работать с yield оператором.

...