Ruby Hash, заполняемый из Array.product, дает неожиданное поведение - PullRequest
0 голосов
/ 08 ноября 2018

Я хотел предварительно заполнить Hash, учитывая массив ключей и значение по умолчанию (пустой массив). Я попытался сделать это, используя #product метод Array.

> hash = Hash[[:foo, :bar].product([[]])]   # => {:foo=>[], :bar=>[]}
> hash[:foo].push(:baz)                     # => {:foo=>[:baz], :bar=>[:baz]}

Я не понимаю, почему значение применяется ко всем ключам в хэше. Если вместо этого я использую возвращаемое значение product и заполняю хеш непосредственно из этого, я получаю ожидаемое поведение.

> [:foo, :bar].product([[]])              # => [[:foo, []], [:bar, []]]
> hash = Hash[[[:foo, []], [:bar, []]]]   # => {:foo=>[], :bar=>[]}
> hash[:foo].push(:baz)                   # => {:foo=>[:baz], :bar=>[]}

Я использую ruby ​​2.3.6

1 Ответ

0 голосов
/ 08 ноября 2018

Это потому, что массивы, которые вы передаете инициализатору хеша, являются одним и тем же объектом, поэтому, если вы измените указанный объект, изменения будут присутствовать везде, где он используется:

> hash = Hash[[:foo, :bar].product([[]])]
 # => {:foo=>[], :bar=>[]} 
> hash[:foo].object_id
 # => 47106586247680 
> hash[:bar].object_id
 # => 47106586247680

Если вы копируете и вставляете выходные данные вашего product, вы используете 2 разных массива, поскольку они создаются отдельно.

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