■例1_yield_引数なし
def three_times
__yield
__yield
__yield
end
three_times{(puts "Hello")}
▼出力結果
Hello
Hello
Hello
▼処理の流れ
1.呼び出し元three_times{(puts "Hello")}が、three_timesメソッドを呼び出す。
2.{(puts "Hello")}ブロックが、three_timesメソッドに渡される。
3.yieldが実行される度に、ブロック内のコードが呼び出される。
<HR size="1" color="#7587DD" style="border-style:dashed">
■例2_yield_引数あり
class Foo
__def print3
____yield(1,2)
__end
end
foo=Foo.new
foo.print3{|x,y|print x,"\n"; print y,"\n"}
▼出力結果
1
2
▼処理の流れ
1.呼び出し元foo.print3{|x,y|print x,"\n"; print y,"\n"}が、print3メソッドを呼び出す。
2.{|x,y|print x,"\n"; print y,"\n"}ブロックが、print3メソッドに渡されると同時に、yieldの引数値(1,2)もブロックに渡される。
3.yieldが実行され、渡されたブロック内のコードが呼び出される。
<HR size="1" color="#7587DD" style="border-style:dashed">
■例3_yield×引数×イテレータ(イテレータの結果がyieldの引数)
class Foo
__def test
____(1..3).each{|i| yield(i)}
__end
end
foo = Foo.new
foo.test{|i| i }
▼処理結果
1..3
▼処理の流れ
1.呼び出し元foo.test{|i| i }が、testメソッドを呼び出す。
2.その際、{|i| i }ブロックは、testメソッドへ渡される。
3.一方、(1..3)は、イテレーターであるeachメソッドで取り出され、順次ブロック変数iへ代入されていく。
4.代入されたブロック変数iは、さらにyieldの引数へ再代入という処理を繰り返すことになる
5.yieldの引数値となったiは、そのまま{|i| i }ブロックに渡される。
6.結果として、eachメソッドで取り出された(1..3)は、yieldが実行される度毎に、渡されたブロック内のコード{|i| i }に代入され続けることになる。
def three_times
__yield
__yield
__yield
end
three_times{(puts "Hello")}
▼出力結果
Hello
Hello
Hello
▼処理の流れ
1.呼び出し元three_times{(puts "Hello")}が、three_timesメソッドを呼び出す。
2.{(puts "Hello")}ブロックが、three_timesメソッドに渡される。
3.yieldが実行される度に、ブロック内のコードが呼び出される。
<HR size="1" color="#7587DD" style="border-style:dashed">
■例2_yield_引数あり
class Foo
__def print3
____yield(1,2)
__end
end
foo=Foo.new
foo.print3{|x,y|print x,"\n"; print y,"\n"}
▼出力結果
1
2
▼処理の流れ
1.呼び出し元foo.print3{|x,y|print x,"\n"; print y,"\n"}が、print3メソッドを呼び出す。
2.{|x,y|print x,"\n"; print y,"\n"}ブロックが、print3メソッドに渡されると同時に、yieldの引数値(1,2)もブロックに渡される。
3.yieldが実行され、渡されたブロック内のコードが呼び出される。
<HR size="1" color="#7587DD" style="border-style:dashed">
■例3_yield×引数×イテレータ(イテレータの結果がyieldの引数)
class Foo
__def test
____(1..3).each{|i| yield(i)}
__end
end
foo = Foo.new
foo.test{|i| i }
▼処理結果
1..3
▼処理の流れ
1.呼び出し元foo.test{|i| i }が、testメソッドを呼び出す。
2.その際、{|i| i }ブロックは、testメソッドへ渡される。
3.一方、(1..3)は、イテレーターであるeachメソッドで取り出され、順次ブロック変数iへ代入されていく。
4.代入されたブロック変数iは、さらにyieldの引数へ再代入という処理を繰り返すことになる
5.yieldの引数値となったiは、そのまま{|i| i }ブロックに渡される。
6.結果として、eachメソッドで取り出された(1..3)は、yieldが実行される度毎に、渡されたブロック内のコード{|i| i }に代入され続けることになる。