yield
Rubyのyieldは、引数に渡されたブロックを実行するためのキーワードです。
def fn(a)
print a
yield
end
fn("a") { print "b" } // 出力結果: "ab"
このように、メソッド(関数)内でyieldを実行すると、末尾に渡されたブロック{ print "b" }
が呼び出されます。
引数の指定
ブロック変数に対して引数を与えることも可能です。
def fn()
yield "a", "b"
end
fn {|a, b| print a, b } // 出力結果: "ab"
このように、yieldで指定した実引数はブロックの仮引数として渡されます。
ブロックの判定
block_given?
メソッドを用いることで、ブロックの有無を知ることも可能です。これによって、ブロックの有無によって処理を分けるようなことも可能になります。
def fn()
if block_given?
yield
else
print "none"
end
end
fn() // 出力結果: "none"
fn() { print "yes" } // 出力結果: "yes"
yieldの活用例
yieldを応用してeach文を自作することも可能です。
def each(ary)
ary.each {|v| yield v }
end
each([1, 2, 3]) {|v| print v }
// 出力結果: "123"
同等のコードはブロック引数を用いて書くことも可能です。
def each(ary, &callback)
ary.each {|v| callback.call(v) }
end
ただ冗長的なコードになります。yieldを用いればそれがスッキリと簡潔に記述できます。意味的にも明確となります。
yieldにはコードの役割や目的を明確にする効果もあるのです。