From: siena@... (Siena.) Date: 2002-06-04T21:24:34+09:00 Subject: [ruby-dev:17313] Re: Range + Enumerable(Re: [ruby-list:35305] Re: ((1.2)..(3.4)).to_a) Siena. です。 ▼ [ruby-dev:17308] < "Shin'ya Adzumi" さん 》> |で、未だに [ruby-dev:17244] の考えが抜けないのですが、succ があるか 》> |どうかよりも、Numeric#step のようにもっと大きな塊を各クラスに任せる 》> |のがいいのではないかと思ってます。step が指定できるようになったとし 》> |て、負の数が指定できるか、少数が指定できるかなどは各クラスに任せる 》> |という感じで。例えば String は正の整数だけしか受けないとか。 》> 》> これは結構有効そうなアイディアだと思います。 》となると、この方向で話を進めるとした場合、残っているのは、 シンプルなルールで要望を満たせそうに思います。 基本的に賛成です。 》 * succ の代わりに何を呼ぶようにするのか 》 》といった辺りでしょうか。後者は Numeric の場合は Numeric#step が使える 》ので他のクラスも step でいいのではないかと思います。幸い step という 》名前は他でも使われてないようですし。 そうですね。特に代案もありませんし、#step の適用対象の自然な 拡張とも思いますし、不必要にメソッドを増やすのもいまいちですしね。 少なくとも、[ruby-list:35272] の first.advance よりは良いです ^^; first.step がブロックを取るなら、そっちで面倒見られますものね... 今思うと、変に #succ ベースにこだわってしまっていたようです。 これで行くとした場合、#step がない時はエラーで良いですか? なければ、代わりに #succ という選択肢もありますけれど、 個人的には #step だけでいいかなと思います。 first.step に与える上限は、Float に対しては diff > 0 の時は、 first.step( last + diff * ( exclude_end? ? -0.5 : 0.5 ), diff ) くらいでも大丈夫でしょうかねぇ。あるいは、Float 以外の時に 単純に last - diff としてしまっていいのかとか考えると、結局 step で終端の開閉を指定できるように拡張した方が良いでしょうか。 せっかく、オブジェクト自身に #step を任せるようにするのですし。 》 * どうやって step を指定するか 》 * Range::new(begin,end,exclude_end,step) 》 * (1..2).new_step(step) で新しい Range を返す(自分自身は変えない) 前者の new は異存ありません。そうなるのは自然だと思います。 後者は、a = Range.new( 1, 2 ) と b = Range.new( 1, 2,, step ) が 生成されるので、ちょっとだけ嬉しくないかなぁという気もします。 あらかじめ a が存在していて、後から b を作り出したいという場合も あるかもしれませんが、これは Range.new( a.first, a.last,, step ) とかはできますので、とりあえずはなくてもいいように思います。 そういう要望が出てくるか、適切な名前を思い付くまでは。 》あと、new_step という名前は適当なのですけど、Range は immutable なの 》で、set_step(step) とか step=(step) とかはふさわしくない気がしてて、 ですね。Range は immutable であって欲しいと思います。 --- Siena.