Причина, по которой ваша строка не работает, заключается в том, что Хэш при обращении к отсутствующему ключу просто возвращает значение по умолчанию (независимо от того, что вы указали), не назначая его клавише.А поскольку ваше значение по умолчанию является сложным изменяемым объектом (и это тот же самый объект, который возвращается каждый раз), вы получаете то, что вы наблюдали: все значения передаются прямо в значение по умолчанию, минуя хеш.Это, вероятно, самая распространенная ошибка с хэшами и изменяемыми значениями по умолчанию.
Чтобы сделать то, что вы хотите, используйте третью форму Hash.new
new {|hash, key| block } → new_hash
, например, например,
h = Hash.new {|h, k| h[k] = [] }