Rubyのyield
それに対して(あ、昨日の続きです)、rubyのyieldっていうのは、たぶんこんな感じだと思います。rubycoさんの1つめのをムリヤリPythonで書くと、
def ruby_yield(block, x): return block(x) def fib_gen(block): a, b = 1, 1 while ruby_yield(block, a): a, b = b, a + b def do_x(x): print x, return x < 5000 >>> fib_gen(do_x) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
まず、Ruby版のfib_gen()はブロックを引数としてとるらしいです。で、yieldはそのブロックを呼び出す関数(?)なのかな。Pythonではブロックを引数に渡すことはできないので(printが無ければlambdaで書けたかな?)関数を定義してそれを渡してみました。
Pythonのyieldはreturnに近いのに対して、Rubyのyieldは関数呼び出しなのに、結果的にfib_gen()はすごく似ているのが面白いです。