2008年12月5日金曜日

Rubyのyield

「Rubyと云う言語をご存知ですか?」

「はい。少々の知識ならあります。」

「では、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 件のコメント:

ただいま作業中

2022/04/13 MySTの翻訳環境作り サイドメニューをプログラムで変換可能にすること 作業の中心場所 – jupyter notebook : g:\jupyter\python pythonをwebでも可能に – g:\webapp\Doc-tools ...