Заполнение хэша в массиве ведет себя иначе, используя «var», а не: var - почему? - PullRequest
0 голосов
/ 26 августа 2011

Почему эти фрагменты кода ведут себя по-разному?Я думал, что они должны были делать то же самое ...

    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 ]

4 голосов
/ 26 августа 2011

Это не " против : - это то, что вы изменяете foo (foo[...]=...) в первом примере, в то время как вы переназначаете переменная foo (foo=...) во втором. В первом примере foo все еще ссылается на тот же объект (который также находится в массиве) после того, как вы ввели значения 3 и 4.

Для решения я рекомендую второй вариант (который вы можете использовать с ' / " (строки) или : (символы), неважно), или в качестве альтернативы вы можете сделать array << foo.clone, чтобы нажать копия foo на массив, поэтому дальнейшие модификации не изменят его.

0 голосов
/ 26 августа 2011

В первом примере вы помещаете foo в массив. Когда вы редактируете foo в следующих нескольких строках, вы редактируете тот же хеш, который вы только что вставили в массив!

Во втором примере вы явно устанавливаете для foo новый хеш, используя операторы {}. Поэтому, когда вы устанавливаете значения 'a' и 'b', вы не трогаете исходный foo, уже вставленный в массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...