为什么这些代码段的行为有所不同?我以为他们应该做同样的事情......
foo = {}
array = []
foo['a'] = "1"
foo['b'] = "2"
array << foo
foo['a'] = "3"
foo['b'] = "4"
array << foo
output => [{"a"=>"3", "b"=>"4"}, {"a"=>"3", "b"=>"4"}]
这不是我想要的。幸运的是,我尝试使用这种格式:
foo = {}
array = []
foo = {
:a => "1",
:b => "2"
}
array << foo
foo = {
:a => "3",
:b => "4"
}
array << foo
output => [{:a=>"1", :b=>"2"}, {:a=>"3", :b=>"4"}]
这里发生了什么?
答案 0 :(得分:4)
不是"
与:
- 这是你在第一个例子中修改 foo
(foo[...]=...
)在第二个中重新重新分配变量foo
(foo=...
)。在第一个示例中,foo
在您输入值3&amp;之后仍然引用同一个对象(也在数组中)。 4。
对于解决方案,我建议使用第二个选项(您可以使用'
/ "
(字符串)或:
(符号),无论如何,或者您可以执行array << foo.clone
将foo
的副本推送到阵列上,因此进一步修改不会改变它。
答案 1 :(得分:0)
在第一个示例中,将foo自身推入数组。当您在接下来的几行上编辑foo时,您正在编辑刚刚推入数组的相同哈希值!
在第二个示例中,您使用“{}”运算符将foo显式设置为新哈希。因此,当您设置'a'和'b'的值时,您不会触摸已经推入阵列的原始foo。