Обнаружил некоторый код, который устанавливает переменную экземпляра следующим образом:
@square_array = Hash.new { Hash.new(false) }
Есть ли причина делать это таким образом?
Скорее одно из следующих:
@square_array = Hash.new
# or
@square_array = {}
@JörgWMittag преходящий значение по умолчанию.
Да, есть причина. Если вы определяете хэш с помощью {}
и пытаетесь получить значение несуществующего ключа, вы получаете 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) }
, вероятно, это то, что они должны использовать, или должен быть комментарий, что они действительно имеют в виду, что не сохраняют значение по умолчанию.
Предположительно, хэш используется каким-то образом, для которого требуется значение по умолчанию.