【发布时间】:2017-12-12 19:19:24
【问题描述】:
我有一个方法:
def test
f = Array.new(4,Array.new(4,false))
f.each do |array|
p array.inspect
end
f[1][1] = true
p "after setting f[1][1]"
f.each do |array|
p array.inspect
end
end
这是输出:
"[false, false, false, false]"
"[false, false, false, false]"
"[false, false, false, false]"
"[false, false, false, false]"
"after setting f[1][1]"
"[false, true, false, false]"
"[false, true, false, false]"
"[false, true, false, false]"
"[false, true, false, false]"
正如您所见,第 1 列中的所有值都变为真,为什么会发生这种情况???
【问题讨论】:
-
不,不是错误。
Array.new(4, Array.new(4,false))将f的每一行设置为来自Array.new(4,false)的 same 4 元素数组。它不会执行Array.new(4,false)4 次。所以f是一个包含 4 个对同一个 4 元素对象的引用的数组。 -
是的,您的代码有错误。
-
@lurker 哈哈,这真的很棘手。感谢您指出。
-
您的示例与文档中的示例几乎完全相同,它解释了这种确切的行为。在Stack Overflow 上也被多次询问和回答。
标签: ruby