Rubyのyieldがなぜわからないか

 むかーしむかし、まだブロック付きメソッドがイテレータと呼ばれていたような時代に、Rubyを覚えようと頑張ったことがあった。その頃はまだC言語すら満足に理解できてなくって、Rubyはまぁ、さっぱりわかってなかった。(さっぱりわかってなくても、Cよりは便利に使えた。やはり、標準ライブラリの充実度の差は大きい。あと正規表現。)
 とりあえずeachを使って配列に対する繰り返しができるようになると、次に考えるのは、自分でイテレータを実装してみたい、という事であろう。というわけで、ブロック付きメソッドを作る事にチャレンジしてみたわけだが、ここで挫折した。
 というような事をふと思い出して、yieldについて調べてみたのだが、さすがに今となっては難しいことは特に無く、あっさりと理解できてしまった。まぁ、高階関数がわかってるなら、特に困るところは無いだろう。むしろ、以前の自分がなぜ理解できなかったのかがわからないぐらいだ。
 というわけで、なんでyieldが理解できなかったかを、昔の自分の経験を思い出しながら考えてみた。

  • {}でくくったものもコードも関数も、まぁ大体一緒だよね、という事自体が分かってなかった
  • yieldという名前に惑わされた

 C言語では関数内でコードを{}でくくっても大した事は起こらない(関数宣言はどうなのという話ではあるが、その当時はそこまで考えてなかった)ので、Rubyでもそうなのかと思っていたんだけど、ブロックはクロージャとほぼ等価であるわけで、無名関数に近い存在である。ということがわかってなかった。
 あと、昔Rubyイテレータについて調べたときには、yieldというのは生み出すという意味なので、値を生み出すイテレータにはぴったりですね!みたいな記述をどこかで見かけたような気がする。今から考えてみると、yieldのここでの適訳は「譲る」の方だろう。処理の流れを譲り渡す、と考えた方がわかりやすい。eachみたいに、副作用目当のイテレータだって存在するんだしね。というか、昔はeachぐらいしかブロック付きメソッド使ってなかったし…。