yield

文法

 状態:  閲覧数:1,476  投稿日:2008-12-06  更新日:  
■例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 }に代入され続けることになる。



モジュール(Module)

self

コメント投稿(ログインが必要)



類似度ページランキング
順位 ページタイトル抜粋
1 yield 100
2 self 44
3 digits 36
4 変数(variable) 35
5 モジュール(Module) 33
6 do 29
7 インスタンス(instance) 19
8 string 18
9 配列(Array) 14
10 syntax error, unexpected tIDENTIFIER, expecting '}' 14
11 autoescape 13
12 引数(parameter) 11
13 シンボル 0
14 クラス 0
15 ローカル変数 0
16 グローバル変数 0
17 インスタンス変数 0
18 クラス変数 0
19 スコープ 0
20 定数 0
2025/5/01 13:09 更新