[#43369] dRuby に CGI を渡す→script_uri が上手く取得出来ない — 石井 大海 <banzaida@...>

こんばんは、konnです。

10 messages 2007/04/05

[ruby-list:43404] Re: 配列についての質問

From: rubikitch@...
Date: 2007-04-09 20:12:19 UTC
List: ruby-list #43404
From: ohrsts@lapis.plala.or.jp
Subject: [ruby-list:43403] 配列についての質問
Date: Tue, 10 Apr 2007 05:02:05 +0900

るびきちです。

a=Array.new(3,Array.new(3))
[ a[0].object_id, a[1].object_id, a[2].object_id ] # => [-605151008, -605151008, -605151008]
a                               # => [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]
a[1][2]="1_2"
a                               # => [[nil, nil, "1_2"], [nil, nil, "1_2"], [nil, nil, "1_2"]]
a[0][2]                         # => "1_2"

これは初心者ならおそらく誰もがハマる間違いです。
a[0], a[1], a[2] は第2引数の Array.new(3) を『共有』しています。
そのため、a[1][2]という破壊的更新をするとa[0][2], a[2][2]も同時に更新されてしまいます。

> a==[[nil, nil, nil], [nil, nil, "1_2"], [nil, nil, nil]]
> とするには、どうしたらよいのでしょうか?

ブロックを使ってください。
要素はそれぞれ別のオブジェクトになります。

a = Array.new(3){ Array.new(3) }
[ a[0].object_id, a[1].object_id, a[2].object_id ] # => [-605152248, -605152378, -605152388]
a                               # => [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]
a[1][2]="1_2"
a                               # => [[nil, nil, nil], [nil, nil, "1_2"], [nil, nil, nil]]
a[0][2]                         # => nil

--
rubikitch
http://www.rubyist.net/~rubikitch/

In This Thread