Ключевое слово
Ruby yield
сильно отличается от ключевого слова Python с тем же именем, поэтому не смущайтесь.Ключевое слово Ruby yield
является синтаксическим сахаром для вызова блока, связанного с методом.
Ближайшим эквивалентом является класс перечислителя Ruby.Например, эквивалент Python:
def eternal_sequence():
i = 0
while True:
yield i
i += 1
таков:
def eternal_sequence
Enumerator.new do |enum|
i = 0
while true
enum.yield i # <- Notice that this is the yield method of the enumerator, not the yield keyword
i +=1
end
end
end
Вы также можете создать перечислители для существующих методов перечисления с помощью enum_for
.Например, ('a'..'z').enum_for(:each_with_index)
дает вам перечислитель строчных букв вместе с их местом в алфавите.Вы получаете это бесплатно с помощью стандартных методов Enumerable, таких как each_with_index
в 1.9, так что вы можете просто написать ('a'..'z').each_with_index
, чтобы получить перечислитель.