home changes contents help options

010:ブロック

Python には Ruby におけるブロックに相当するものはありません。

ただし、ブロックはクロージャを受け取る関数、およびその呼び出しを直感的にかけるようにしたものなので 同様の処理は不可能ではありません。ただし Ruby のコードよりは読みにくくなってしまいます。

# Ruby
# 定義
def do_twice
    yield
    yield
end

# 呼び出し
do_twice{ p "Ruby" }

これはブロック引数を用いて書くと次のようになります。

# Ruby
# 定義
def do_twice(&b)
    b.call
    b.call
end

# 呼び出し
do_twice{ p "Ruby" }

これを Python に翻訳すると次のようになります。呼び出しに用いるブロックの内容は事前に def 文で関数として定義しておかなければなりません。

# Python
# 定義
def do_twice(b):
    b()
    b()

# 呼び出し
def block():
    print 'Python'

do_twice(block)

ブロック付きメソッドが通常の仮引数も持つ場合は、たとえば次のようになります。

# Ruby
# 定義
def do_twice(arg)
    yield arg
    yield arg
end

# 呼び出し
do_twice('Ruby'){|arg|
    p arg
}
# Ruby
# 定義
def do_twice(arg, &b)
    b.call arg
    b.call arg
end

# 呼び出し
do_twice('Ruby'){|arg|
    p arg
}
# Python
# 定義
def do_twice(arg, b):
    b(arg)
    b(arg)

# 呼び出し
def block(arg):
    print arg

do_twice('Python', block)