From: "助田 雅紀" Date: 1999-04-09T09:24:01+09:00 Subject: [ruby-list:13525] Re: iterator for Dummies( was Re: Ruby anyw here ) 助田です.ちょっと長いです. In [ruby-list:13488] Re: iterator for Dummies( was Re: Ruby anywhere ) > 豊福@パパイヤです。 > 「C++のイテレータ」も知らないので、どなたか上の内容が >実感できる C++ と Ruby の具体的なコードで説明して頂け >ませんか。 実感できるかどうか判りませんが,私は,こんな感じのことを まつもとさんがおっしゃってるのかなあと思ったというのを 以下に書きます.(外しているかも知れませんし,私も完全 に理解している訳ではないです.) まずは,C++の例です. (間違っているところは指摘願います.> C++使いの方) #include #include #include using namespace std; int a[] = {1,2,3,4,5}; static void output(int& i) { cout << i << " "; } int main(int, char**) { vector ary(a, a+5); /* 外部イテレータ >> C++のイテレータのようなのは外部イテレータ(またはカーソル) に該当するのがこれです. >> 「複数の配列からひとつずつ要素を取り出し比較する」 >> ような処理は内部イテレータでは書けません. はよくわかりませんが,外部イテレータを使えば 「複数の配列からひとつずつ要素を取り出し比較する」 ような処理は可能であることはわかります.(よね?) ループの制御も自前でやっています. */ vector::iterator i; //i がカーソル? for(i=ary.begin(); i!=ary.end(); i++) { output(*i); } cout << endl; /* 外部イテレータを使った内部イテレータ >>関数ポインタか手続きオブジェクトがあれば, >>外部イテレータを使って内部イテレータを実装できます の部分がこれです.&output が関数ポインタに該当します. 外部イテレータそのものは表面上でてこないし,ループ制御 も見えない.for_each の中でループ制御をやってると思います. */ for_each(ary.begin(), ary.end(), &output); cout << endl; return 0; } ちなみに出力結果は 1 2 3 4 5 1 2 3 4 5 となります. で,Rubyの例です. ary = [1,2,3,4,5] def output(i) print i, " " end #内部イテレータです.ループの制御が表面には #でてきません ary.each do |i| output(i) end print "\n" 出力結果は 1 2 3 4 5 です. 内部イテレータを使って外部イテレータを普通は実装できないが 実は,Ruby ではできるという部分は私にもよくわかりません. -------------------------------------------- 助田雅紀(masaki.suketa@systemplaza.co.jp) --------------------------------------------