K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[417] Re:クラスメソッドとクラス変数
投稿者:kit
2007/02/20 02:13:25

> >あと、制御構造の抽象化としてiteratorのようなものを表現する場合、 > >Ruby(のeachメソッド)みたいにクロージャをメソッドに渡す形でサンプルを > >書いてみたのですが、 > >もっとうまいやり方がありますか? > これでよいのではないでしょうか。 えーと、iterator は、iterator 自体がオブジェクトであるような 作りにした方が便利だと思います。iterator を利用する側が 必ず closure を作るのは面倒くさいですし、なにより、 複数のコレクションを、複数の iterator を使って同時に並行して アクセスするようなプログラム、たとえばコレクションどうしの 大小比較: function compare(i, j) { for (; !i.isDone() && !j.isDone(); i.next(), j.next()) { if (i.currentItem() < j.currentItem()) return -1; if (i.currentItem() > j.currentItem()) return 1; } if (i.isDone() && j.isdone()) return 0; if (i.isDone()) return -1; else return 1; } print(compare(ArrayIterator(a), ArrayIterator(b)) + "\n"); みたいなことをしようとすると、eachメソッド方式では困っちゃいます。 なので、たぶん次のような設計の方がいいと思います。 function ArrayIterator(anArray) { this = new_object(); this.theArray = anArray; this.index = 0; this.first = closure() { this.index = 0; } this.next = closure() { this.index++; } this.isDone = closure() { return this.index >= this.theArray.size(); } this.currentItem() = closure() { return this.theArray[this.index]; } return this; } と、ここまで書いて、実際に動作するプログラムかどうか試そうとしたら、 文法エラーになっちゃいました。UNIX版をコンパイルしてみたんですが、 次のような1行だけのプログラムで a = {1,2}; 1:文法エラー({付近) となります。 また、次のような2行だけのプログラムでも a = new_object(); a.hoge = 1; 2:不正な文字(.) となります。 crowbarの実装の中身は全然見てないんですが、UNIX版だけの問題なんでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]