在数组中填充哈希的行为使用“var”而不是:var - 为什么?

时间:2011-08-26 04:53:41

标签: ruby-on-rails ruby arrays variables hash

为什么这些代码段的行为有所不同?我以为他们应该做同样的事情......

    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"}]

这里发生了什么?

2 个答案:

答案 0 :(得分:4)

不是": - 这是你在第一个例子中修改 foofoo[...]=...)在第二个中重新重新分配变量foofoo=...)。在第一个示例中,foo在您输入值3&amp;之后仍然引用同一个对象(也在数组中)。 4。

对于解决方案,我建议使用第二个选项(您可以使用' / "(字符串)或:(符号),无论如何,或者您可以执行array << foo.clonefoo的副本推送到阵列上,因此进一步修改不会改变它。

答案 1 :(得分:0)

在第一个示例中,将foo自身推入数组。当您在接下来的几行上编辑foo时,您正在编辑刚刚推入数组的相同哈希值!

在第二个示例中,您使用“{}”运算符将foo显式设置为新哈希。因此,当您设置'a'和'b'的值时,您不会触摸已经推入阵列的原始foo。