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()はすごく似ているのが面白いです。