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"] # nilHash.new(default) change cela. Chaque clé manquante renvoie la valeur que vous avez fournie :
scores = Hash.new(0)
puts scores["Alice"] # 0C'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.
Défi
FacileLisez 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: 20Si 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"] # 0Cela 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
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
1Les chaînes de caractères en profondeur
Aperçu des méthodes de chaînesInterpolation de chaînesParcourir les chaînesSplit et JoinRécapitulatif - String Weaver4Blocs, Procs & Lambdas
Qu'est-ce qu'un bloc ?do..end vs AccoladesLe mot-clé yieldParamètres de blocProcs et LambdasRécapitulatif - Itérateur personnalisé7Hashes - Partie 2
Hash.new avec des valeurs par défautItérer sur les HashesHashes imbriquésFusion et transformationRécapitulatif - Compteur de fréquence10Projet - Dossiers étudiants
Présentation du projetAjouter un étudiant2Intervalles
Qu'est-ce qu'un intervalle ?Méthodes d'intervalleLes intervalles dans Case / WhenRécapitulatif - Pratique des intervalles5La puissance d'Enumerable
Select et RejectChaîner MapReduce / Injectcount, all?, any?, none?group_by et partitionsort_by, min_by, max_byRécapitulatif - Data Pipeline