Menu
Coddy logo textTech

Hash.new avec des valeurs par défaut

Fait partie de la section Logique et Flux du Journey Ruby de Coddy — leçon 33 sur 56.

Par défaut, la recherche d'une clé manquante dans un hash retourne nil :

scores = {}
puts scores["Alice"]   # nil

Hash.new(default) change cela. Chaque clé manquante renvoie la valeur que vous avez fournie :

scores = Hash.new(0)
puts scores["Alice"]   # 0

C'est la manière la plus propre d'écrire un compteur. Vous n'avez pas besoin de vérifier if scores[name].nil? avant l'incrémentation :

counts = Hash.new(0)
["a", "b", "a", "c", "a"].each do |letter|
  counts[letter] += 1
end
puts counts.inspect   # {"a"=>3, "b"=>1, "c"=>1}

Important : Hash.new(0) définit la valeur par défaut à 0 mais ne stocke pas la clé lorsque vous la lisez. Le hash reste vide jusqu'à ce que vous fassiez une affectation. Ainsi, une fois que vous écrivez counts[letter] += 1, la clé est ajoutée avec la nouvelle valeur.

challenge icon

Défi

Facile

Lisez une liste d'entrées category:amount séparées par des virgules (par ex. food:12,gas:30,food:8,books:25,gas:15). Construisez un hash des totaux par catégorie en utilisant Hash.new(0), puis affichez uniquement les catégories dont le total est d'au moins 20, une par ligne, triées par total décroissant :

<category>: <total>

Pour l'exemple d'entrée ci-dessus, la sortie est :

gas: 45
books: 25
food: 20

Si aucune catégorie n'atteint 20, n'affichez rien.

Aide-mémoire

Par défaut, les clés de hachage manquantes retournent nil. Utilisez Hash.new(default) pour retourner une valeur par défaut différente à la place :

scores = Hash.new(0)
puts scores["Alice"]   # 0

Cela rend les compteurs propres — pas besoin de vérifier nil avant l'incrémentation :

counts = Hash.new(0)
["a", "b", "a"].each do |letter|
  counts[letter] += 1
end
# {"a"=>2, "b"=>1}

Note : la lecture d'une clé manquante ne la stocke pas. La clé n'est ajoutée qu'une fois que vous lui assignez une valeur (par ex. +=).

Essayez vous-même

entries = gets.chomp.split(",")

# TODO: totals = Hash.new(0); accumuler le montant par catégorie ;
#       puis afficher les catégories avec un total >= 20, triées par total décroissant
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique et Flux