При этом используется конструктор Hash.new
для создания хэша, элементы которого по умолчанию имеют пустой список. Поэтому вы можете сделать что-то вроде этого:
months[2012] << 'January'
, и массив будет создан без предварительного выполнения months[2012] = []
.
Краткое объяснение : { |h, k| h[k] = [] }
Является блоком Ruby и, как упоминал mu, его можно в некоторой степени сравнить с function
в Javascript или lambda
в Python. По сути, это анонимный фрагмент кода, который принимает два аргумента (h
, k
, каналы имеют значение только для отделения параметров от кода) и возвращает значение. В этом случае он берет хеш и ключ и устанавливает значение ключа в новый массив []
. Возвращает ссылку на хеш (но это не важно в этом контексте).
Теперь к Hash.new
: это конструктор для Hash
, который, я полагаю, вы уже сейчас знаете, что это такое. При желании он принимает в качестве аргумента блок, который вызывается при каждом обращении к ключу, который еще не существует в хэше. В приведенном выше примере ключ 2012
ранее не был доступен, поэтому вызывается блок, который создает новый массив и присваивает его ключу. После этого оператор <<
может работать с этим экземпляром массива.