豊福@パパイヤです。

  さっき突然「ブロック付メソッド(いわゆるイテレータ)」が
自分の中で消化できたような気がしたので報告します。:-)
(今までも一応理解できてプログラムも書けるつもりでいましたが
親近感を持てませんでした)


  私の消化の障害になっていたのは馴染みのない yield でした。
例えば
  def sort; ... yield(x1,x2) ...; end
  sort { |x1,x2| ... }
というのを見たときに感じるのは、字面上ブロックの存在を意識
しないのに yield によってよくわからないまま実行されてしまっ
たようなだまされた気分。
(紐モデルじゃないですが、呼び出し時のブロックと yield の
つながりがはっきり見えない心許なさ)
これを
  def sort(&block); ... block.call(x1,x2) ...; end
と読みかえた途端、C言語で馴染みのあった
  void qsort(...,cmpar) { ... (*cmpar)(x1,x2) ...}
  int cmpfunc(x1,x2) { ... }
  qsort(..., cmpfunc);
との類似性を感じて消化できたような気がしました。


ということで(上の話が大筋間違っていないとしたら)
C言語育ちの私にとっての「はやわかりイテレータ」は

・ブロック付メソッドというのは C言語でいうと「関数ポインタを
  引数に持つ関数」(例えば qsort)みたいなものである。ただし
  Ruby では関数ポインタではなくブロックが渡ってくる。
  (コンテキストとかの違いもあるんでしょうけどそれは置いといて)

  この喩えは前田さんの「はやわかりイテレータ」をはじめよく出て
  きますが C言語で書くときの不便さの方が強調されて類似性の
  方は(yield の馴染みのなさとあいまって)あまり印象に残らない
  気がします。

・def sort; ... yield(x1,x2) ...; end は
  def sort(&block); ... block.call(x1,x2) ...; end
  と読みかえて、C言語の
  qsort(...,cmpar) { ... (*cmpar)(x1,x2) ...}
  との類似性を感じとる。

でした。
---
			豊福@パパイヤ
			unbound / papaya.juice.or.jp
			toyofuku / juice.or.jp