【Ruby】yieldとは【意味 使い方 応用 有効性について】

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にはコードの役割や目的を明確にする効果もあるのです。

広告