あらいしゅんいちです。

いや、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)=熊谷秀武
>
>