From: matz@... (Yukihiro Matsumoto) Date: 2002-05-30T14:44:57+09:00 Subject: [ruby-dev:17228] Re: [ruby-list:35305] Re: ((1.2)..(3.4)).to_a まつもと ゆきひろです ruby-devに移動します。 In message "[ruby-list:35305] Re: ((1.2)..(3.4)).to_a" on 02/05/29, "Shin'ya Adzumi" writes: |Numeric#succ はちょっと…なのですが、とりあえずそれは置いてお |いて。succ が単に + で定義できるのであれば、Range#each の中で、 | | * succ があれば n 回 succ を呼ぶ | * succ がなければ +n する | |というのでも良いんじゃないかなと思いました。まあ、String#+ は |呼ばれてはまずいんですけど(String#succ があるから大丈夫?)。 ちょっと考えてみました。で、結局問題があるのは member?, include? step, eachおよびeachを元にしたEnumerableメソッド であることがわかりました。そこで、 * member?, include? Numericであるか、succが定義されていなければ範囲によるチェッ クを行う。succが定義されていれば繰り返してみてその要素が あるかないかをチェック。 * step, eachおよびeachを元にしたEnumerableメソッド eachはsuccが定義されていなければTypeError例外(だから Float のRangeには使えない。これにより全部のEnumerableメ ソッドは要素がsuccを持つ必要がある。 stepはNumericならstepを毎回+する(Floatでは誤差が蓄積する が、ここでは無視)。それ以外ならsuccを使って定義する。 という定義にします。1.7では一時的にTime#succを(秒単位で)定義 していましたが、これはなくします。 これでNumericであるかないか、succ があるかないかで、連続区間 と不連続区間の両方の役を果たせるように思います。 こんなものでどうでしょう? まつもと ゆきひろ /:|)