Ruby数组 [""]*3 怪异行为

[code="ruby"]
cvs = ["a",""]; #第一种空格
cvs << Array.new(3, "") # 第二种空格
cvs.flatten!()
puts cvs.inspect
cvs.collect! do |item|
item.insert(0,"\"")<<"\"";
end

puts cvs.inspect
[/code]

结果最后三个都是: """"""

第一种空格和第二种空格有什么区别?

问题出在Array.new(3,"")上。
对这种方式创建的Array,每个元素指向的实际上都是同一个对象。
在你的collect!处理中,当处理到这三个元素时,每次都在同一个对象前后增加"号,所以最终变成了三对"号。

楼上说的没错,Array.new(3,"")确实是每个元素都是同一个对象。

[code="java"]

Array.new(3,"")
=> ["", "", ""]
a=Array.new(3,"")
=> ["", "", ""]
a.map{|item| item.object_id}
=> [39405660, 39405660, 39405660]
[/code]

而像collect!这样以!结尾的方法具有破坏性,会改变对象,所以才。。