Существует два основных способа решения этой проблемы.@llya назначает значение по умолчанию для хэша, @ fl00r применяет значение по умолчанию, когда хэш оценивается для несуществующего ключа, в результате чего возвращается nil
.
llya показывает один способ реализации значения по умолчанию,Это очень понятно, но использует несколько строк кода.Два других способа сделать это заслуживают упоминания (хотя я не предполагаю, что они в каком-то смысле лучше, чем то, как это сделал Илья).
Установите значение по умолчанию, затем добавьте пары ключ-значение:
hash = Hash.new('1234567').
merge('FI'=>'+358501111', 'RU'=>'4019900780', 'SE'=>'+4672345678',
'UA'=>'0123456789', 'KZ'=>'0123456789').
freeze
hash['oh, my']
#=> "1234567"
Использование Object # tap
hash = { 'FI'=>'+358501111', 'RU'=>'4019900780', 'SE'=>'+4672345678',
'UA'=>'0123456789', 'KZ'=>'0123456789'
}.tap { |h| h.default = '1234567' }.
freeze
hash['oh, my']
#=> "1234567"
Вариант fl00r
|| DEFALULT
подхода, который, возможно, гласит:лучше использовать Hash # fetch :
hash = { 'FI'=>'+358501111', 'RU'=>'4019900780', 'SE'=>'+4672345678',
'UA'=>'0123456789', 'KZ'=>'0123456789' }
DEFAULT = "1234567"
hash.fetch('oh, my', DEFAULT)
#=> "1234567"
hash[key] || DEFAULT
явно нельзя использовать, если hash
имеет ключ, значение которого может быть nil
или false
,хотя это не проблема здесь.
Оба подхода имеют свои плюсы и минусы.Установка значения по умолчанию устраняет необходимость извлечения значений (что может быть сделано в нескольких местах), чтобы заботиться о том, содержит ли хеш определенный ключ, но, с другой стороны, читатели этих частей кода могут не знать (или забыли) что хеш был определен со значением по умолчанию.Если используется подход || DEFAULT
, существует вероятность того, что кодер может забыть включить || DEFAULT
в одно или несколько мест, на которые ссылается хеш.С точки зрения обслуживания кода, я бы подумал, что это бросок, при условии, что константа DEFAULT
определена в непосредственной близости от хэша и соответствующим образом прокомментирована.
Мне кажется, что обычно лучше использоватьзначение по умолчанию, и где бы ни упоминался хеш, напомните читателям, что у него есть значение по умолчанию, либо с комментарием, либо с подсказочным именем для хеша (например, applies_to_oranges_with_default
).