あらいしゅんいちです。 いや、Arrayには初期化されていない項というのはないんですよ。 a = [0,1,2,3,nil,5] というのがあったとして、a[4]は初期化されてないわけではなくて nilが入っているわけです。 だから、もしa[100] = 100とかして100に代入した場合、 6から99にも値を入れて初期化しなければならないわけです。 もしその間の値が存在しないまま使いたいのであれば、 Hashを使うのが適当ということになります。 ----- ARAI Shunichi (family,given) http://www.mellowtone.co.jp arai2006 / mellowtone.co.jp ----- Original Message ----- From: "take_tk" <ggb03124 / nifty.com> To: "ruby mailing list" <ruby-list / ruby-lang.org> Sent: Friday, July 07, 2006 4:52 PM Subject: [ruby-list:42554] Re: Array#default > たけ(tk)です > > [ruby-list:42551] Re: Array#default にて > 小西 弘将 <konishi / raax.co.jp> さん曰く: > >> >欲しいなと思うときは、行や桁の個数をあらかじめ特定できないような二重配列 >> >の場合やデータが離散的で全てを初期化する必要がない場合、などです。 >> 可変配列を考える場合でも、配列の拡張の時に初期値を与えることができますよ >> ね? > > エクセルの例[ruby-list:42553] などではどうでしょう? > >> 二重配列以上は、現在標準がないのですから、それをやるのは個々人の責任とい >> う気がします(二重配列のインプリメントの問題)。 > > それはそれとして・・ > >> 初期化しない配列の中身を知ることにdefaultという関数を作るのと、初期化を >> 必ずするということのコストは、初期化を必ずした方がコストが同程度か安いと >> 思います。範囲外のアクセスは、例外発生だと思います。 > > エクセルの例ではどうでしょう? > >> 逆に、default導入で、配列中にないオブジェクトが帰ってくようになると、そ >> れはそれで困ると思うのですが。 > > これはHash#default でも同じです。([ruby-list:42536] で指摘した『オブジェ > クトの共有』の問題) > > ---- > a = Hash.new > a.default = [] > > a[1] = [ 1 ] > b = a[0] # 初期化されていないので、Hash#defaultを呼び出す > b[0] = 2 # a[0][0]に代入したつもりなのに??? > > p b #=> [] > p b[0] #=> 2 > p a[0][0] #=> 2 > p a #=> {1=>[1]} > ---- > > この問題があるので、Hash.new(){} というのが導入されたわけです。 > > ---- > a = Hash.new(){|h,k|h[k]=[]} > > a[1] = [ 1 ] > b = a[0] # 初期化されていないので、Hash.new のブロックを呼び出す > b[0] = 2 # a[0][0]に代入した > > p b #=> [2] > p b[0] #=> 2 > p a[0][0] #=> 2 > p a #=> {0=>[2], 1=>[1]} > ---- > > これと同じことをArrayでやるのが、[ruby-list:42536] Array#default っちゅー > ことです。 > > まあ、既に自前のライブラリにしてしまったので、標準でなくても困らないので > すが、何で Hash で出来て、Array では出来ないのだろう? という疑問です。 > > Take_tk = KUMAGAI Hidetake > たけ(tk)=熊谷秀武 > >