2012-02-02 10 views

Respuesta

11

Si no necesita almacenar ese valor por defecto en hash que puede utilizar Hash#fetch método:

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

Si necesita, además de almacenar su valor por defecto cada vez que acceda clave inexistente y se eres el uno inicializar el hash puede hacerlo utilizando Hash#new con un bloque:

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

Constructor de la clase Hash aceptar un valor por defecto, el mismo será devuelto si no se encuentra una llave adecuada.

h = Hash.new("default") 

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

h["jake"] 
=> "default" 

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

Si ya tiene un hash, se puede hacer esto:

h.fetch(key, "default value") 

O explotar el hecho de que una clave no existente volverá nil:

h[key] || "default value" 

Para crear hashes con valores predeterminados depende de lo que quieras hacer exactamente.

  • independiente de la llave y no se almacenará:

    h = Hash.new("foo") 
    h[1] #=> "foo" 
    h #=> {} 
    
  • Dependiendo de la llave y se almacenará:

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

Usando h [tecla] || "valor por defecto" no es guardar, si ya hay algo falso allí será anulado – Sebastian

+0

Es por eso que lo enumeré como una de varias posibilidades. En general, la gente tiene una idea de cómo serán los valores de sus hashes, si sabes que no vas a guardar valores booleanos, es un enfoque perfectamente correcto. –

3

Si va a almacenar un valor por defecto puede ser nulo y debe calcularlo en el momento del almacenamiento:

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

Si desea asignar el valor por defecto para el hash si no existe la clave (aún), puede utilizar el operador ||=, es decir:

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

value se le asignará 'non_default_value' y value2 se asignar 'default_value'

Después de estas asignaciones h tendrán la non_existing_key conjunto de 'default_value':

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

Cuestiones relacionadas