Сопоставить значение, если другие не совпадают - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть эта карта Ruby:

FIXED_COUNTRY_TO_PHONE = { 
    'FI' => '+358501111',
    'RU' => '4019900780', 
    'SE' => '+4672345678',
    'UA' => '0123456789',
    'KZ' => '0123456789'  
  }.freeze

Как мне установить какое-то окончательное значение, например '*' => '1234567', если другие значения не совпадают?

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Вы можете использовать Hash#default= для установки значения по умолчанию:

hash =  {
    'FI' => '+358501111',
    'RU' => '4019900780', 
    'SE' => '+4672345678',
    'UA' => '0123456789',
    'KZ' => '0123456789'  
  }
hash.default = '1234567'
hash['UK']
#=> '1234567'
0 голосов
/ 18 сентября 2018

Существует два основных способа решения этой проблемы.@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).

0 голосов
/ 18 сентября 2018
FIXED_COUNTRY_TO_PHONE = Hash.new('1234567').merge({ 
    'FI' => '+358501111',
    'RU' => '4019900780', 
    'SE' => '+4672345678',
    'UA' => '0123456789',
    'KZ' => '0123456789'  
  }).freeze

Но просто

DEFAULT = "1234567".freeze
FIXED_COUNTRY_TO_PHONE["FI"] || DEFAULT
#=> "+358501111"
FIXED_COUNTRY_TO_PHONE["??"] || DEFAULT
#=> "1234567"

Выглядит тоже неплохо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...