yieldがキマったと思ったコードがかけたので
個人的にキマったと思ったので
yieldとは
まずは辞書で引いてみましょう。
英和辞典では
- a〈作物・製品などを〉産する.
b〈利子・収益などを〉もたらす,生む.
c〈結果などを〉引き起こす.- 〔+目的語(+up)+to+(代)名詞〕
a (圧迫または圧力に負けて)〈陣地などを〉〔敵などに〕明け渡す,譲渡する 《★【類語】 surrender は完全に屈服して放棄する; yield は譲歩して一時的に屈するの意の含みがある》.
b [yield oneself で] 〔誘惑などに〕身をゆだねる,ふける.
weblioだとこのような感じです。以降のyieldはおおよそ2.の意味だと思われます。
C#とVisualBasic.NETでは
列挙可能なコレクションを簡単に返す構文として、VisualStudio 2005の発表と時を同じく言語仕様が更新されて登場しました。私が最初に触れたyieldはこれです。
それまでC#だと
IEnumerable<int> GetEnumerable(int count) { IEnumerable<int> ret = new List<int>(); for (int i = 0; i < count; i++) { ret.Add(i); } return ret; }
と書いていたものが、yieldを使うと
IEnumerable<int> GetEnumerable(int count) { for (int i = 0; i < count; i++) { yield return i; } }
と書けるようになりました。
Function GetEnumerable(count As Integer) As IEnumerable(Of Integer) For i As Integer = 0 To count - 1 Yield Return i Next End Function
もちろんVisualBasic.NETでもこのようにほぼ同様の構文で使えます。もっとも、今はEnumerable.Range(int)で上と同じことができるのですが…若干制限があり、
- 戻り値の型は IEnumerable、IEnumerable
、IEnumerator、または IEnumerator である必要があります。 - 申告は ref または http://msdn.microsoft.com/ja-jp/library/vstudio/t3c3bfhx.aspx のパラメーターを持つことはできません。
Rubyでは
最初はよくわかってませんでしたが、最近うまく使えたなと思う例がこちらです。
#これのもう少し複雑なのが5つくらいあった def valid_a? valid? {|i| i.fuga? } end def valid_b? valid? {|i| i.hoge == 3 && i.piyo == 2 } end ... private def valid? i = Hoge.new.certain_method @hoge #実際はもう少し複雑 yield i end
こちらはイテレーションに限らず、yieldと書いたところがブロックの中身に置き換わり、何か値を渡せばブロック内の変数として使うことができる、ということでしょうか。ドキュメントには
「自分で定義したブロック付きメソッドでブロックを呼び出すときに使います。 yield に渡された値はブロック記法において | と | の間にはさまれた 変数(ブロックパラメータ)に代入されます。」と簡潔に記されています。