ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

yieldがキマったと思ったコードがかけたので

個人的にキマったと思ったので

yieldとは

まずは辞書で引いてみましょう。

英和辞典では

  1. a〈作物・製品などを〉産する.
    b〈利子・収益などを〉もたらす,生む.
    c〈結果などを〉引き起こす.
  2. 〔+目的語(+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)で上と同じことができるのですが…若干制限があり、

などといった条件があります

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 に渡された値はブロック記法において | と | の間にはさまれた 変数(ブロックパラメータ)に代入されます。」と簡潔に記されています