Причина использования «Hash.new {Hash.new(false)}»

Обнаружил некоторый код, который устанавливает переменную экземпляра следующим образом:

@square_array = Hash.new { Hash.new(false) }

Есть ли причина делать это таким образом?

Скорее одно из следующих:

@square_array = Hash.new 

# or

@square_array = {}

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

Jörg W Mittag 31.05.2019 07:22

@JörgWMittag преходящий значение по умолчанию.

Aleksei Matiushkin 31.05.2019 07:26
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
2
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, есть причина. Если вы определяете хэш с помощью {} и пытаетесь получить значение несуществующего ключа, вы получаете nil

hash = {}
#=> {}
hash[:a]
#=> nil

Но если вы определите его с помощью Hash.new, вы можете установить значение определения для несуществующего ключа.

hash =  Hash.new { Hash.new(false) }
#=> {}
hash[:a]
#=> {}
hash[:a][:a]
#=> false

Вероятно, стоит отметить, что код имеет небольшую ошибку и, вероятно, не работает должным образом. Hash.new { |h, k| h[k] = Hash.new(false) }, вероятно, это то, что они должны использовать, или должен быть комментарий, что они действительно имеют в виду, что не сохраняют значение по умолчанию.

mu is too short 31.05.2019 08:46

Другие вопросы по теме