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の間でコードを移植する際に役立つでしょう。