新井です。 # 深く追求するつもりはなかったのですが、一応自分の # 考えも書いておかないとズルイかと思いましたので… >>> 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]で報告済み