AllIsHackedOff

Just a memo, just a progress

yield文について

yield何じゃらほい

Railsをかじり始めたときにerbテンプレートに書く<% yield %>などを見て何じゃらほいと思ったのは結構前のことだ。Rubyを書く機会はそれほど多くなかったので、ブロック渡せるのは便利だなー程度にしか感じていなかったのですが、最近若干調べる意欲がわいたのでメモ

参考 (Qiita)[Ruby基礎] ブロックとProcをちゃんと理解する

  • コード
def block_foo
  puts "given block if block_given? # block_given => 1 (ブロックが引数として与えられたとき
  puts "foo1"
  yield
  puts "foo2"
end

block_foo do
  puts "block!!!"
end
  • 実行結果
block given
foo1
block!!!
foo2

このyieldはブロックの戻り値を返すとのこと。 yieldの呼び出し時に渡した引数がブロックの引数になる。

  • コード
def foo
  yield "a", "b"
end

foo do |a, b|
  puts a
  puts b
  c = 333
  puts c
end
  • 実行結果
a
b
333

Procを使ってさらに便利に

  • コード
people = %w(Taro Jiro Saburo)
p1 = Proc.new { |name| puts name }
people.each &p1 # オブジェクトをブロックにして渡す。
  • 結果
Taro
Jiro
Saburo

注意

  • ブロック内の変数のスコープはブロック内のみ(外からは参照できない)
  • ブロックの外の変数値を上書きするのは可能