Может кто-нибудь объяснить мне подробно, что происходит в этом блоке Ruby? - PullRequest
0 голосов
/ 01 февраля 2012

Изучение Руби. Необходимо создать хэш массивов. Это работает ... но я не совсем понимаю, что делает Руби. Может ли кто-нибудь объяснить это подробно?

months = Hash.new{|h, k| h[k] = []}

1 Ответ

3 голосов
/ 01 февраля 2012

При этом используется конструктор Hash.new для создания хэша, элементы которого по умолчанию имеют пустой список. Поэтому вы можете сделать что-то вроде этого:

months[2012] << 'January'

, и массив будет создан без предварительного выполнения months[2012] = [].

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

Теперь к Hash.new: это конструктор для Hash, который, я полагаю, вы уже сейчас знаете, что это такое. При желании он принимает в качестве аргумента блок, который вызывается при каждом обращении к ключу, который еще не существует в хэше. В приведенном выше примере ключ 2012 ранее не был доступен, поэтому вызывается блок, который создает новый массив и присваивает его ключу. После этого оператор << может работать с этим экземпляром массива.

...