2012-02-02 50 views
29

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

ответ

11

Если вам не нужно сохранять значения по умолчанию в хэш вы можете использовать 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' } 
15

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

h = Hash.new("default") 

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

h["jake"] 
=> "default" 

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

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

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

Использование h [key] || «Значение по умолчанию» не сохраняется, если в нем уже есть ложь, он будет переопределен – Sebastian

+0

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

3

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

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

Если вы хотите присвоить значение по умолчанию для хэша, если ключ не существует (пока), вы можете использовать ||= оператора, то есть:

h = {some_key: 'non_default_value'} 
value = h[:some_key] ||= 'default_value' 
value2 = h[:non_existing_key] ||= 'default_value' 

value будет назначен 'non_default_value' и value2 будет быть назначен 'default_value'

После этих заданий h будет иметь non_existing_key набор для 'default_value' в:

{:some_key=>"non_default_value", :non_existing_key=>"default_value"}

Смежные вопросы