web-dev-qa-db-fra.com

Si la clé n'existe pas, créez la valeur par défaut

Quelqu'un peut-il me montrer une manière Ruby de vérifier si une clé existe dans un hachage et si elle ne lui donne pas alors une valeur par défaut. Je suppose qu'il y a une seule ligne qui utilise à moins mais je ne sais pas quoi utiliser.

33
Steve

Si vous avez déjà un hachage, vous pouvez le faire:

h.fetch(key, "default value")

Ou vous exploitez le fait qu'une clé non existante retournera nil:

h[key] || "default value"

Pour créer des hachages avec des valeurs par défaut, cela dépend de ce que vous voulez faire exactement.

  • Indépendant de la clé et ne sera pas stocké:

    h = Hash.new("foo")
    h[1] #=> "foo"
    h #=> {}
    
  • En fonction de la clé et sera stocké:

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

Le constructeur de la classe Hash accepte une valeur par défaut, elle sera retournée si aucune clé correspondante n'est trouvée.

h = Hash.new("default")

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

h["jake"]
=> "default"

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

Si vous n'avez pas besoin de stocker cette valeur par défaut dans le hachage, vous pouvez utiliser Hash#fetch méthode:

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

Si vous devez en plus stocker votre valeur par défaut à chaque fois que vous accédez à une clé inexistante et que vous êtes celui qui initialise le hachage, vous pouvez le faire en utilisant Hash#new avec un bloc:

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

Vous pouvez utiliser le ||= opérateur:

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"}
7
Matthijs

Si vous stockez une valeur par défaut qui peut être nulle et que vous devez la calculer au moment du stockage:

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