Я плохо знаком с Ruby, есть ли путь к yield
значения от функций Ruby? Если да, как? В противном случае, что мои опции состоят в том, чтобы написать ленивый код?
Ключевое слово Ruby yield
сильно отличается от ключевого слова Python с тем же именем, поэтому пусть оно вас не смущает. Ключевое слово Ruby yield
- это синтаксический сахар для вызова блока, связанного с методом.
Ближайшим эквивалентом является класс Ruby Enumerator. Например, эквивалент 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
, чтобы получить перечислитель.
Я видел волокна , используемые таким образом, посмотрите пример из этой статьи :
fib = Fiber.new do
x, y = 0, 1
loop do
Fiber.yield y
x,y = y,x+y
end
end
20.times { puts fib.resume }