From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1998-03-12T15:08:34+09:00 Subject: [ruby-dev:1721] Re: argument check in Range::new けいじゅ@日本ラショナルソフトウェアです. In [ruby-dev :01715 ] the message: "[ruby-dev:1715] Re: argument check in Range::new ", on Mar/12 14:10(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです > >うーん,大抵の場合は生成してすぐにeachを実行するんであんまり >問題はないでしょうけどね.でも,lastがノーチェックというのは >ちょっと気分が悪いですね.InfinityがNumericであるというのは >そんなに変な話なんでしょうか. 変な話しではないと思うのですが... それはともかく, このチェックはきびしすぎるような気がします. if (!(FIXNUM_P(first) && FIXNUM_P(last)) && (TYPE(first) != TYPE(last) || CLASS_OF(first) != CLASS_OF(last) || !rb_respond_to(first, upto)) && !(obj_is_kind_of(first, cNumeric) && obj_is_kind_of(last, cNumeric))) { ArgError("bad value for range"); } lastとfirstのクラスが一致しなくてはいけないというところがです. それで は, Numericは対応できないから別扱いにしているところがいかにも苦しい. そのクラスがComparableであれば, comp.comparable?(other) という2項演算子を定義しなくてはならないとして, if (rb_funcall(first, rb_intern("comparable?"), 1, last)) で判断するのはいかがでしょう? # 大げさ過ぎるかなあ... __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@rational.com <<---