将字符串压入数组中的数组会产生意外结果

wil*_*l_d 6 ruby

我在Ruby中有一个由5个空数组组成的数组.我试图使用<<运算符将字符串推入第一个数组,但结果是字符串被推入所有数组.请帮我理解这个.

预期的产出是:

# => [["car"], [], [], [], []]
Run Code Online (Sandbox Code Playgroud)

但相反,我得到:

# => [["car"], ["car"], ["car"], ["car"], ["car"]]
Run Code Online (Sandbox Code Playgroud)

irb dump:

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\"]]" 
Run Code Online (Sandbox Code Playgroud)

Ped*_*nto 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 > 
Run Code Online (Sandbox Code Playgroud)

试试这个:

ree-1.8.7-2012.02 :008 > output = []
 => [] 
ree-1.8.7-2012.02 :009 > 5.times{output << []}
 => 5 
Run Code Online (Sandbox Code Playgroud)


Mak*_*oto 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
Run Code Online (Sandbox Code Playgroud)

所以你的追加output[0]将按预期工作:

irb(main):049:0> output[0] << "cat"
=> ["cat"]
irb(main):050:0> output
=> [["cat"], [], [], [], []]
Run Code Online (Sandbox Code Playgroud)