2006年7月 7日

[ruby-list:42554] Re: Array#default

たけ(tk)です

[ruby-list:42551] Re: Array#default にて
小西 弘将 さん曰く:

> >欲しいなと思うときは、行や桁の個数をあらかじめ特定できないような二重配列
> >の場合やデータが離散的で全てを初期化する必要がない場合、などです。
> 可変配列を考える場合でも、配列の拡張の時に初期値を与えることができますよ

> ね?

エクセルの例[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)=熊谷秀武


投稿者 xml-rpc : 2006年7月 7日 16:52
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/41464
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。