Подтвердить что ты не робот

Если ключ не существует, создайте значение по умолчанию

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

4b9b3361

Ответ 1

Если у вас уже есть хеш, вы можете сделать это:

h.fetch(key, "default value")

Или вы используете тот факт, что несуществующий ключ вернет nil:

h[key] || "default value"

Для создания хэшей со значениями по умолчанию это зависит от того, что вы хотите сделать точно.

  • Независимо от ключа и не будет сохранено:

    h = Hash.new("foo")
    h[1] #=> "foo"
    h #=> {}
    
  • Зависит от ключа и будет сохранен:

    h = Hash.new { |h, k| h[k] = k * k } 
    h[2] #=> 4
    h #=> {2=>4}
    

Ответ 2

Конструктор класса Hash принимает значение по умолчанию, то же самое будет возвращено, если соответствующий ключ не найден.

h = Hash.new("default")

h.has_key?("jake")
=> false

h["jake"]
=> "default"

h["jake"] = "26"
h.has_key?("jake")
=> true

Ответ 3

Если вам не нужно сохранять это значение по умолчанию в хэш, вы можете использовать метод Hash#fetch:

hash = {}
hash.fetch(:some_key, 'default-value') # => 'default-value'
p hash
# => {}

Если вам нужно дополнительно сохранить значение по умолчанию каждый раз, когда вы обращаетесь к несуществующему ключу, и вы инициализируете хэш, вы можете сделать это, используя Hash#new с блоком:

hash = Hash.new { |hash, key| hash[key] = 'default-value' }
hash[:a] = 'foo'
p hash[:b]
# => 'default-value'
p hash
# => { :a => 'foo', :b => 'default-value' }

Ответ 4

Если вы сохраняете значение по умолчанию, которое может быть nil, и вам нужно рассчитать его во время хранения:

hash = {}
...
hash.fetch(key) {|k| hash[k] = calc_default()}

Ответ 5

Вы можете использовать оператор ||=:

hash   = {some_key: 'some_value'}
puts hash[:some_key] ||= 'default_value'         # prints 'some_value'
puts hash[:non_existing_key] ||= 'default_value' # prints 'default_value'
puts hash.inspect # {:some_key=>"some_value", :non_existing_key=>"default_value"}