From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1998-04-07T03:31:50+09:00 Subject: [ruby-dev:2101] Re: [ruby-list:7298] Re: cmp operator けいじゅ@日本ラショナルソフトウェアです. In [ruby-dev :2095 ] the message: "[ruby-dev:2095] Re: [ruby-list:7298] Re: cmp operator ", on Apr/06 22:21(JST) Tadayoshi Funaba writes: >ふなばです。 >>(C や perl と同じように書けた方がより愉しくプログラミングできるよなぁ >>というわけです). > >Ruby に C と同じものを要求すると、プログラミングが辛くなると思います。 >そういうことを考えはじめると、ないものねだりしたくなるからです。そのよ >うな気持を満足させようとしはじめると、キリがなく、そのうち、Ruby が正 >体不明になってしまうおそれがあると思います。 あるいは Ruby は C になる >しかないのかも。 私も同意見です. 愉しくプログラムを組むのと, 楽にプログラムを組むのは違 うのでは? と思っています. perlやCの様にできるっていうのは愉しいという よりは, 楽になるだけですよね. と, この話しは余談で: >僕が気にしているのは、演算子やメソッドの仕様や速度のことではなくて、こ >こなんです。で、話をややこしくしてしまうかもしれないのですが、ひとつ、 >考えてみたいことがあります。配列や構造体のように要素やメンバに順番があ >るものに対して順に <=> を適用してくれる仕掛があったら、 つかいたいと思 >うでしょうか? 速度的にも、可読性についても、こっちのほうが有利そうです >(ちょっと Perl 的かな)。 Enumeratableのインスタンスどうしを辞書式順序で比較するメソッドですね. このアイディアは面白いと思います. 今までなかったのが不思議なぐらいです ね(^^;;; # Enumeratableで定義できれば, ArrayもStructもOKですので, Enumeratableでは, ちょっと奇麗に書けませんが... module Array def <=>(other) ary = self.to_a o_ary = other.to_a for i in 0 .. [ary.size, o_ary.size].min if (r = ary[i] <=> o_ary[i]) != 0 return r end end return ary.size <=> o_ary.size end end そうすれば, 発端となった [ruby-list:7286] は: def struct_cmp (a, b) [a.mem_a, a.mem_b] <=> [b.mem_a, b.mem_b] end とできますね. 配列を勝手に辞書式順序にしちゃうのは問題があるかも知れませんので, その 時は別メソッド名にすれば良いでしょう. あと, selfとotherが同じクラスに 限定すべきかもしてませんが... PS. 2つのEnumerableのインスタンスで, 二重eachをうまく書く方法はありません かね? each()だけでは無理そうですね. 配列化(to_a)すれば実現はできるんで すけど... __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@rational.com <<---