Rubyのコンテキストでは、 yieldという単語は実際には特別な意味を持ちません。これは、他のすべてのプログラミング言語、またはプログラミングやコンピュータサイエンス全般で意味するのと同じことを意味します。
これは通常、ある種の実行コンテキストが制御フローを別の実行コンテキストに引き渡すときに使用されます。たとえば、Unixにはsched_yield
、スレッドがCPUを別のスレッド(またはプロセス)に譲るために使用できる関数があります。コルーチンでは、この用語yield
は一般に、あるコルーチンから別のコルーチンに制御を移すために使用されます。C#には、yield
反復メソッドに制御を放棄するために反復メソッドによって使用されるキーワードがあります。
Enumerator::Yielder#yield
実際、この最後の使用法は、あなたが尋ねていたRubyのメソッドの使用法とまったく同じです。このメソッドを呼び出すと、列挙子が一時停止され、列挙メソッドの制御が放棄されます。
例:
fibs = Enumerator.new do |y|
a, b = 0, 1
y.yield a
loop do
y.yield b
a, b = b, a + b
end
end
puts fibs.next # 0
puts fibs.next # 1
puts fibs.next # 1
puts fibs.next # 2
puts fibs.next # 3
puts fibs.next # 5
puts fibs.next # 8
puts fibs.next # 13
puts fibs.next # 21
ご覧のとおり、無限ループがあります。明らかに、このループが単独で実行された場合は、あまり役に立ちません。ただし、メソッドにヒットするたびにyield
、再度呼び出されるまで制御を放棄するため、フィボナッチ数が1つずつ生成され、基本的にすべてのフィボナッチ数の無限に長いリストが生成されます。
Fiber.yield
同様の目的を果たす別の方法があります。Fiber
(実際、コルーチンの単なるRubyの名前であるため、上記ですでに説明しました。)の内部で、元々制御を与えていた実行コンテキストに制御を戻すためにFiber
呼び出します。Fiber.yield
最後にyield
、メソッド本体内で使用されるキーワードがあります。これは、メソッドに渡されたブロックへの制御を放棄するために使用されます。
少なくともこの場合(つまり最初の例)では、を呼び出すたびに新しい値が生成されるため、を生成するEnumerator
とさらに解釈できることに注意してください。yield
Enumerator
yield