Можно создать дубликат:
Ruby method Array#<< not updating the array in hash
Strange ruby behavior when using Hash.new([])Hash.new ([]) не ведет себя, как и ожидалось
Я делал Koans, который является большим, и, как я иду и я не нахожу никаких серьезных проблем, но я наткнулся на это и не могу сделать из этого никакого смысла:
def test_default_value_is_the_same_object
hash = Hash.new([])
hash[:one] << "uno"
hash[:two] << "dos"
assert_equal ["uno", "dos"], hash[:one] # But I only put "uno" for this key!
assert_equal ["uno", "dos"], hash[:two] # But I only put "dos" for this key!
assert_equal ["uno", "dos"], hash[:three] # I didn't shove anything for :three!
assert_equal true, hash[:one].object_id == hash[:two].object_id
end
Все тесты проходят (я просто посмотрел на ошибку, которая помогла мне угадать правильные утверждения для написания).
Последнее утверждение, нормально, оба они не были инициализированы, поэтому их значения имеют одинаковый идентификатор объекта, поскольку оба они принимают значение по умолчанию.
Я не понимаю, почему значение по умолчанию было изменено, я даже не уверен, что это произошло.
Я попробовал это в IRB, думая, что, возможно, какое-то вмешательство в Hash/Array было сделано, чтобы сойти с ума, но я получаю тот же результат.
Я сначала подумал hash[:one] << "uno"
будет означать hash
стать { one: ["uno] }
, но остается { }
.
Хотя я предполагаю, что <<
вызывает только push
и новые ключи добавляются только при использовании =
знака
Пожалуйста, скажите мне, что я пропустил.
EDIT: Я использую рубин 1.9.3
Существует только * один * массив: значение ('[]') оценивается * до того, как вызывается метод 'new'. Попробуйте «форму по умолчанию», которая берет блок (для создания массива * new * для реального времени каждый раз, когда блок получает/вызывается). Я уверен, что это дубликат. –
Да, укусил это пару раз :) –
@pst вы могли бы разработать? Я не уверен, что буду следовать. И я не нашел подобных вопросов в SO/Google/Duckduckgo, но я всегда могу пропустить вещи;) –