新井です。

# 深く追求するつもりはなかったのですが、一応自分の
# 考えも書いておかないとズルイかと思いましたので…

>>> From: Yoshinori Toki <toki / freedom.ne.jp>
>>> Date: 19 Jan 1999 14:24:29 +0900
>>> Subject: [ruby-list:11630] Re: Array.new([SIZE])

> 土岐です。

> でもよく考えたら、予約した大きさの nil の詰った配列に添字をインクリメ
> ントしながら代入していけば済むことですね。で、最後に余った尻尾を切り落
> す。

ふむ、これだけ単純な処理だとそれもまぁアリなんです
が、私は添字用の変数が発生するのをたぶん嫌うと思ん
です(尻尾を切る処理も嫌だな)。で、クラスにカプセル
化することを考えるわけですが…

頻繁にpush、popを行う処理があった場合に、

class LargeStack
    def initialize(capa)
        @len = 0
        @array = Array.new(capa)
    end
    def push(elm)
      @array[@len] = elm
      @len += 1
    end
    def pop
      raise "stack is empty" if @len == 0
      @len -= 1
      @array[@len]
    end
end

こんなクラスを実装したとします。(たぶんこのような
状況では私はやります)

でも、もっと複雑な処理が必要になってArrayの他のメ
ソッドも欲しくなった場合。最終的に昔のArrayの実装
が出来上がってしまうとなんだか悲しくなりますね。
(^^;

Array.new()の仕様が今のようになった以上、
「メモリのリアロケートが裏で発生するかもしれない」
という考えは捨て去るのが健康的かも知れない。

# これは、私の理想。でも、あきらかに処理の無駄だと
# 思える部分はやっぱり気になってしまう。

ちなみに、Array.new()の今の仕様は、配列のコンスト
ラクタとしては自然な実装なのでokです。私の最初の発
言、

> 個人的には、昔の仕様の方がよかったかなと思います。

は、

「個人的には、領域だけを確保する手段が別に提供され
ててもよかったかなと思います」

と訂正します。この考えは変わりません。(要望ではな
く意見です。これに対する回答はまつもとさんの最初の
発言で頂いているので、とくに希望しませんが)。

# この件で、いろいろ考えてたら些細なバグを見つけて
# しまった。[ruby-dev:4243]で報告済み