41

私は Ruby を初めて使用しyieldます。Ruby 関数から値を取得する方法はありますか? はいの場合、どのように?そうでない場合、遅延コードを作成するためのオプションは何ですか?

4

5 に答える 5

59

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)、小文字の列挙子とアルファベット内の位置を示します。each_with_indexこれは、1.9 のような標準の Enumerable メソッドを使用して無料で取得できるため、記述('a'..'z').each_with_indexするだけで列挙子を取得できます。

于 2010-03-24T00:55:40.770 に答える
24

この記事のを見てください。

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 }
于 2010-03-24T09:02:40.530 に答える
15

遅延して値を生成しようとしている場合は、@Chuck の答えが正しいものです。

コレクションを遅延反復処理する場合は、Ruby 2.0 で新しい.lazy列挙子が導入されました。

range = 1..Float::INFINITY
puts range.map { |x| x+1 }.first(10) #  infinite loop
puts range.lazy.map { |x| x+1 }.first(10) #  [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
于 2015-05-16T16:18:16.397 に答える