2006年7月 7日

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

たけ(tk)です

[ruby-list:42544] Re: Array#default にて
Yukihiro Matsumoto <matz@xxxxx> さん曰く:

> |(1)Hash#default があるのに Array#default は無いようです。何故なんでしょ
> |うか?
>

> 「配列だから」ではないでしょうか。配列は「値の並び」というモ
> デルが明確なので、範囲外をアクセスした場合に特定の値を返され
> てもあんまりうれしい局面が思いつきません。

欲しいなと思うときは、行や桁の個数をあらかじめ特定できないような二重配列
の場合やデータが離散的で全てを初期化する必要がない場合、などです。

----
require "Array_default" # [ruby-list:42536] Array#default

N = 20
SIZE = 5

data = (1..N).collect{ "(#{'%2.3f'%(rand+rand)},#{'%2.4f'%(rand+rand)})" }.join("\n")

ret = []
ret.extend(Array_default)
ret.default = proc{|a,n|
a[n] = []
a[n].extend(Array_default)
a[n].default = proc{|aa,nn|aa[nn]=[]}
a[n]
}

data.each{|line|
next unless /\((.+),(.+)\)/ =~ line
x = $1.to_f
y = $2.to_f
ret[(x*SIZE).to_i][(y*SIZE).to_i].push(line.chomp)
}
p ret

#=> [
#=> nil,
#=> [nil, nil, nil, nil, ["(0.331,0.886)", "(0.388,0.836)"]],
#=> [nil, nil, nil, nil, nil, nil, ["(0.572,1.378)"]],
#=> [nil, nil, nil, nil, nil, nil, ["(0.615,1.278)", "(0.667,1.333)", "(0.664,1.358)"], nil, nil, ["(0.686,1.840)"]],
#=> [nil, nil, nil, nil, ["(0.900,0.855)", "(0.804,0.922)", "(0.939,0.800)"]],
#=> [nil, ["(1.060,0.334)"], nil, ["(1.097,0.695)"], nil, nil, ["(1.141,1.221)"]],
#=> [nil, nil, nil, nil, ["(1.339,0.892)"], nil, ["(1.248,1.246)"], ["(1.253,1.403)"]],
#=> [nil, nil, ["(1.486,0.552)"], nil, nil, nil, ["(1.588,1.213)", "(1.416,1.212)"]],
#=> [nil, nil, nil, nil, nil, nil, nil, ["(1.676,1.404)"]]
#=> ]

Take_tk = KUMAGAI Hidetake
たけ(tk)=熊谷秀武


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




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