6

5つの空の配列で構成されるRubyの配列があります。演算子を使用し<<て文字列を最初の配列にプッシュしようとしていますが、その結果、文字列がすべての配列にプッシュされます。これを理解するのを手伝ってください。

期待される出力は次のとおりです。

# => [["car"], [], [], [], []]

しかし、代わりに私は得る:

# => [["car"], ["car"], ["car"], ["car"], ["car"]]

irbダンプ:

1.9.3-p194 :001 > output = Array.new(5, [])
 => [[], [], [], [], []] 
1.9.3-p194 :002 > output.inspect
 => "[[], [], [], [], []]" 
1.9.3-p194 :003 > output[0].inspect
 => "[]" 
1.9.3-p194 :004 > output[0] << "car"
 => ["car"] 
1.9.3-p194 :005 > output.inspect
 => "[[\"car\"], [\"car\"], [\"car\"], [\"car\"], [\"car\"]]" 
4

3 に答える 3

6

それらはすべて同じオブジェクトです:

ree-1.8.7-2012.02 :001 > output = Array.new(5, [])
 => [[], [], [], [], []] 
ree-1.8.7-2012.02 :002 > output[0]
 => [] 
ree-1.8.7-2012.02 :003 > output[0].object_id
 => 2219989240 
ree-1.8.7-2012.02 :004 > output[1].object_id
 => 2219989240 
ree-1.8.7-2012.02 :005 > output[2].object_id
 => 2219989240 
ree-1.8.7-2012.02 :006 > output[3].object_id
 => 2219989240 
ree-1.8.7-2012.02 :007 > output[4].object_id
 => 2219989240 
ree-1.8.7-2012.02 :008 > 

これを試して:

ree-1.8.7-2012.02 :008 > output = []
 => [] 
ree-1.8.7-2012.02 :009 > 5.times{output << []}
 => 5 
于 2012-05-31T03:54:56.370 に答える
5

配列がその方法で初期化されている場合、Pedro Nascimento が指摘したように、それらはすべて同じオブジェクト ID を持ちます。同様の構文を使用してネストされた配列を作成することで、これを回避できます。

irb(main):047:0> output = Array.new(5) {[]}
=> [[], [], [], [], []]
irb(main):048:0> output.each {|i| puts i.object_id}
10941700
10941680
10941660
10941640
10941620

したがって、追加先output[0]は期待どおりに機能します。

irb(main):049:0> output[0] << "cat"
=> ["cat"]
irb(main):050:0> output
=> [["cat"], [], [], [], []]
于 2012-05-31T04:04:31.380 に答える
1

コード

output = Array.new(5, [])

オブジェクトのコピーを 1 つだけ作成しようとしています。

そう

ree-1.8.7-2012.02 :003 > output[0].object_id
 => 2219989240 
ree-1.8.7-2012.02 :004 > output[1].object_id
 => 2219989240 
ree-1.8.7-2012.02 :005 > output[2].object_id
 => 2219989240 
ree-1.8.7-2012.02 :006 > output[3].object_id
 => 2219989240 
ree-1.8.7-2012.02 :007 > output[4].object_id
 => 2219989240 

オブジェクトの複数のコピーを作成する場合は、これを使用します

     output = Array.new(5) {[]}    #=> [[], [], [], [], []] 

コード

 output.each {|i| puts i.object_id}

あなたに見せます

1.9.3-p194 :005 >  output.each {|i| puts i.object_id}
13417360
13417340
13417320
13417300
13417280
 => [[], [], [], [], []] 
于 2012-05-31T04:30:53.903 に答える