From: Shin'ya Adzumi Date: 2002-06-03T17:24:57+09:00 Subject: [ruby-dev:17293] Range + Enumerable(Re: [ruby-list:35305] Re: ((1.2)..(3.4)).to_a) あづみです。 Wakou Aoyama wrote: > > それだと、Range + Enumerable の特性が消えてしまうのでなんとかした > > いです。Range の幅が大きくなればなるほどメモリの同時使用量が増えて > > しまうのはちょっと。 > > > > と、かく言う私もつい数日前までは同じ事を思っていたのですが(苦笑 > > みなさん同じようですね。 > > 確かに、range.slice.each{} ぐらいならまだいいとして、 > range.slice.collect{} などすると、まるっきり倍になってしまいますからねえ。 Array を挟まないことが効率が良い場合がある(貧弱な環境では劇的といっ てもいい差がある場合がある)事に気がついてからは、Enumerable として 便利になるように Range を変更するのがいいのではないかと思ってます。 # 考えが二転三転してすみません 連続区間としての Range はとりあえず置いておいて(というか現状のまま でいいとして)、非連続空間としての Range として不便だなと思うのは、 * 必ず begin < end * 幅が固定 この辺かなと思います。特に前者は (3..1).each とかを Array を挟まな いで実行できるようになりたいわけで。ただ、これだと succ に依存して いる現状ではどうやっても実現できません。 で、未だに [ruby-dev:17244] の考えが抜けないのですが、succ があるか どうかよりも、Numeric#step のようにもっと大きな塊を各クラスに任せる のがいいのではないかと思ってます。step が指定できるようになったとし て、負の数が指定できるか、少数が指定できるかなどは各クラスに任せる という感じで。例えば String は正の整数だけしか受けないとか。 もちろん exclude_end という問題は何も解決していないのですが、 exclude_end という概念は Range 固有のものでしょうか? Numeric#step のようなものにも与えて良いのであれば、これも各クラスに任せてもいい と思うのですけどどうでしょうか? # Numeric#step に exclude_end を追加しようとかいうことではありませ # ん。念のため。 # って、別名の似たようなメソッドを作るぐらいしか他の方法は思い浮か # んではいないのですけど。 安積伸弥 adzumi@denpa.org