あづみです。

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