В первом случае значением по умолчанию, возвращаемым, когда ключ не существует, является []
.Затем различные операторы успешно добавляют различных собак и белок в возвращаемые массивы.
Однако ни в коем случае не существует ключа, когда-либо созданного для :dogs
или :squirrels.
Во втором случаеблок действительно сохраняет новое значение в хеш-записи, используя ключ.
Одна вещь, которая несколько интересна, это то, как вы продолжаете получать новый пустой массив обратно в первом случае.И ответ таков: вы не передали []
как параметр, а как блок.Это исполняемый файл, и он сохраняется как процесс.Каждый раз, когда ключ не найден, процесс запускается снова и генерирует новый []
.
Вы можете увидеть это в действии, обратите внимание на различные значения идентификатора объекта:
irb > t = Hash.new { [] }
=> {}
irb > t[:a].object_id
=> 2149202180
irb > t[:a].object_id
=> 2149192500