豊福@パパイヤです。 助田さん >> 「C++のイテレータ」も知らないので、どなたか上の内容が >>実感できる C++ と Ruby の具体的なコードで説明して頂け >>ませんか。 > > 実感できるかどうか判りませんが,私は,こんな感じのことを > まつもとさんがおっしゃってるのかなあと思ったというのを > 以下に書きます. ありがとうございます。 > まずは,C++の例です. > #include <vector> > #include <algorithm> ... > vector<int> ary(a, a+5); こういうのが標準であるんですか。たいぶ昔に C++ を勉強 しただけなので知りませんでした。 > 外部イテレータ > >> C++のイテレータのようなのは外部イテレータ(またはカーソル) > に該当するのがこれです. ... > vector<int>::iterator i; //i がカーソル? > for(i=ary.begin(); i!=ary.end(); i++) { > output(*i); > } begin,end,++ の実装がカーソルの中に隠蔽されているわけ ですね。 > 外部イテレータを使えば > 「複数の配列からひとつずつ要素を取り出し比較する」 > ような処理は可能であることはわかります.(よね?) for(i=ary.begin(), j=ary2.begin; i!=ary.end(); i++,j++) { *i と *j を比較する } みたいなことですかね。 > >>関数ポインタか手続きオブジェクトがあれば, > >>外部イテレータを使って内部イテレータを実装できます > の部分がこれです.&output が関数ポインタに該当します. > 外部イテレータそのものは表面上でてこないし,ループ制御 > も見えない.for_each の中でループ制御をやってると思います. > for_each(ary.begin(), ary.end(), &output); なるほど。 > で,Rubyの例です. ... > #内部イテレータです.ループの制御が表面には > #でてきません > ary.each do |i| > output(i) > end これは Ruby ではおなじみですね。 この続きの thread, callcc がらみの話はもうちょっと じっくり読んでから反応させてもらいます。 --- 豊福@パパイヤ unbound / papaya.juice.or.jp toyofuku / juice.or.jp