「はい。少々の知識ならあります。」
「では、yieldについて説明してください。」
「・・・・・」
コールバック関数同様、分かった様な分からない様な代物。
(勿論、私だけのことかもしれませんが・・・)
そこで、白黒をつけようと、納得いくまで調べることに。
分かったことは、「主客を逆転して考えること」でした。
例えば、以下のコードを見てください。
def bar
yield 10
end
bar {|v|
p v + 3
}
(これはRuby本家からの引用です。)
bar {・・・} が主(呼ぶ側(メイン))で、def ~end が客(呼ばれる側(関数))ですが、
誤解を懼れずに、yieldを単なる関数名として書き換えてみると、理解し易くなります。
def yield(v)どうでしょう。関数からメインをコールするように主客が逆転しています。
p v + 3 # メイン内のブロック
end
yield(10) # 関数内の yield 10
要するに、コールバック関数(メイン内のブロック)をコールするのがyieldです。
これでスッキリ。頭の中のモヤモヤが取り払われませんか。
唐突に、メインに出現する変数 v の意味も、漸く理解できたのではないでしょうか。これでスッキリ。頭の中のモヤモヤが取り払われませんか。
確認のため、もう1例(「Rubyプログラミング入門」から)。
def foo(x,y)
x + yield(6,y)
end
bar (1, 3){|a,b|
a / b
} #=> 3
この場合、 x=1, y=3 なので
def yield(a,b)と、書き換えることができます。
a / b
end
yield(6, 3) #=> 2
結果は
x + yield(6,y) = 1 + yield(6,3) = 1 + 2 = 3
になります。
0 件のコメント:
コメントを投稿