Есть ли что-то как генераторы Python в Ruby?

Я плохо знаком с Ruby, есть ли путь к yield значения от функций Ruby? Если да, как? В противном случае, что мои опции состоят в том, чтобы написать ленивый код?

36
задан bodacydo 23 March 2010 в 23:58
поделиться

2 ответа

Ключевое слово 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 , чтобы получить перечислитель.

51
ответ дан 27 November 2019 в 05:28
поделиться

Я видел волокна , используемые таким образом, посмотрите пример из этой статьи :

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 }
23
ответ дан 27 November 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: