Вы перепутали способ, которым это работает немного.Во-первых, у хэша нет метода <<
, этот метод в вашем примере существует в массиве.
Причина, по которой ваш код не содержит ошибок, заключается в том, что вы передаете значение по умолчанию в свой хэшконструкторhttp://ruby -doc.org / core-1.9.3 / Hash.html # method-c-new
hash = Hash.new([])
Это означает, что если ключа не существует, то онвернет массив.Если вы запустите следующий код:
hash = {}
hash[:one] << "uno"
Тогда вы получите неопределенную ошибку метода.
Итак, в вашем примере, что на самом деле происходит:
hash = Hash.new([])
hash[:one] << "uno" #hash[:one] does not exist so return an array and push "uno"
hash[:two] << "dos" #hash[:two] does not exist, so return the array ["uno"] and push "dos"
Причина, по которой он не возвращает массив с одним элементом каждый раз, как вы можете ожидать, заключается в том, что он хранит ссылку на значение, которое вы передаете в конструктор.Это означает, что каждый раз, когда элемент выдвигается, он изменяет исходный массив.