Ruby Language Définition des valeurs par défaut


Exemple

Par défaut, tenter de rechercher la valeur d'une clé qui n'existe pas renverra nil . Vous pouvez éventuellement spécifier une autre valeur à renvoyer (ou une action à effectuer) lorsque le hachage est accessible avec une clé inexistante. Bien que cela soit appelé "la valeur par défaut", il ne doit pas nécessairement s'agir d'une valeur unique. il pourrait s'agir, par exemple, d'une valeur calculée telle que la longueur de la clé.

La valeur par défaut d'un hachage peut être transmise à son constructeur:

h = Hash.new(0)

h[:hi] = 1 
puts h[:hi]  # => 1 
puts h[:bye] # => 0 returns default value instead of nil

Un défaut peut également être spécifié sur un hachage déjà construit:

my_hash = { human: 2, animal: 1 }
my_hash.default = 0
my_hash[:plant] # => 0

Il est important de noter que la valeur par défaut n'est pas copiée à chaque fois qu'une nouvelle clé est utilisée, ce qui peut donner des résultats surprenants lorsque la valeur par défaut est un type de référence:

# Use an empty array as the default value
authors = Hash.new([])

# Append a book title 
authors[:homer] << 'The Odyssey'

# All new keys map to a reference to the same array:
authors[:plato] # => ['The Odyssey']

Pour contourner ce problème, le constructeur Hash accepte un bloc qui est exécuté à chaque accès à une nouvelle clé, et la valeur renvoyée est utilisée par défaut:

authors = Hash.new { [] }

# Note that we're using += instead of <<, see below
authors[:homer] += ['The Odyssey']
authors[:plato] # => []

authors # => {:homer=>["The Odyssey"]}

Notez que ci-dessus, nous avons dû utiliser + = au lieu de << car la valeur par défaut n'est pas automatiquement attribuée au hachage; using << aurait ajouté au tableau, mais les auteurs [: homer] seraient restés indéfinis:

authors[:homer] << 'The Odyssey' # ['The Odyssey']
authors[:homer] # => []
authors # => {}

Pour pouvoir attribuer des valeurs par défaut à l’accès, ainsi que pour calculer des valeurs par défaut plus sophistiquées, le bloc par défaut est transmis à la fois au hachage et à la clé:

authors = Hash.new { |hash, key| hash[key] = [] }

authors[:homer] << 'The Odyssey'
authors[:plato] # => []

authors # => {:homer=>["The Odyssey"], :plato=>[]}

Vous pouvez également utiliser un bloc par défaut pour effectuer une action et / ou renvoyer une valeur dépendant de la clé (ou d'autres données):

chars = Hash.new { |hash,key| key.length }

chars[:test] # => 4

Vous pouvez même créer des hachages plus complexes:

page_views = Hash.new { |hash, key| hash[key] = { count: 0, url: key } }
page_views["http://example.com"][:count] += 1
page_views # => {"http://example.com"=>{:count=>1, :url=>"http://example.com"}}

Pour définir la valeur par défaut sur Proc sur un hachage déjà existant , utilisez default_proc= :

authors = {}
authors.default_proc = proc { [] }

authors[:homer] += ['The Odyssey']
authors[:plato] # => []

authors # {:homer=>["The Odyssey"]}