【发布时间】:2012-03-23 06:31:02
【问题描述】:
a = Array.new(3,[])
a[1][0] = 5
a => [[5], [5], [5]]
我认为这没有意义! 不应该是 => [[], [5], []] 或者这是 Ruby 的一种特性?
【问题讨论】:
a = Array.new(3,[])
a[1][0] = 5
a => [[5], [5], [5]]
我认为这没有意义! 不应该是 => [[], [5], []] 或者这是 Ruby 的一种特性?
【问题讨论】:
改用这个:
a = Array.new(3){ [] }
在您的代码中,每个条目的值都使用相同的对象;一旦您改变了其中一个引用,您就会看到所有其他引用都发生了变化。使用上述方法,您可以在每次需要新值时调用该块,每次返回一个新数组。
这本质上类似于新用户提出的关于为什么以下内容无法按预期工作的问题:
str.gsub /(<([a-z]+)>/, "-->#{$1}<--"
在上面,字符串插值发生在gsub 方法被调用之前,所以它不能在你的字符串中使用$1 的当前值。同样,在您的问题中,您创建一个对象并将其传递给Array.new before Ruby 开始创建数组槽。是的,默认情况下,运行时可以在项目上调用dup……但这可能会造成灾难性的后果并且速度很慢。因此,您可以通过块形式自行确定如何创建初始值。
【讨论】: