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
注意
- ブロック内の変数のスコープはブロック内のみ(外からは参照できない)
- ブロックの外の変数値を上書きするのは可能