PythonとRubyのyieldキーワードは、それぞれの言語で異なる概念を表現します。
Rubyのyield
Rubyでは、yieldは無名関数(ブロック)を呼び出すためのショートカットとして使用されます。以下に例を示します。
def do_stuff(val)
puts "Started executing do_stuff"
yield(val+3)
yield(val+4)
puts "Finished executing do_stuff"
end
do_stuff(10) {|x| puts x+3} # This is a block, which is an anonymous function
このコードは、do_stuffメソッドが呼び出されると、まず"Started executing do_stuff"を出力し、次にブロック(無名関数)を2回呼び出し、最後に"Finished executing do_stuff"を出力します。
Pythonのyield
一方、Pythonではyieldキーワードが関数定義内にある場合、その関数はジェネレータとなります。ジェネレータは、実行を途中で停止し、再開することができる特殊なタイプの関数です。以下に例を示します。
def do_stuff(val):
print("Started execution of do_stuff()")
yield val + 3
print("Line after 'yield val + 3'")
yield val + 4
print("Line after 'yield val + 4'")
print("Finished executing do_stuff()")
my_gen = do_stuff(10)
val = next(my_gen)
print("--received {} from generator".format(val))
このコードは、do_stuffジェネレータが呼び出されると、まず"Started execution of do_stuff()"を出力し、次にyield文に到達して結果を返し、実行を停止します。ジェネレータに対してnext()が再度呼び出されると、実行が再開され、次のyield文に到達するまで実行されます。
まとめ
Rubyのyieldは、無名関数(ブロック)を呼び出すためのショートカットです。一方、Pythonのyieldは、ジェネレータ(実行を途中で停止し、再開することができる特殊なタイプの関数)を作成するためのキーワードです。これらの違いを理解することで、PythonとRubyの間でコードを移植する際に役立つでしょう。