Reduce / Inject
Fait partie de la section Logique et Flux du Journey Ruby de Coddy — leçon 23 sur 56.
Parfois, vous avez besoin de réduire un tableau entier à une seule valeur, une somme, un produit, une chaîne la plus longue. reduce (également appelé inject : même méthode, deux noms) est l'outil.
Le bloc prend deux paramètres : l'accumulateur et l'élément actuel. La valeur de retour du bloc devient l'accumulateur suivant.
total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }
puts total # 10Étape par étape, l'accumulateur est 0 → 1 → 3 → 6 → 10.
Le premier argument est la valeur de départ de l'accumulateur. Si vous l'omettez, Ruby utilise le premier élément du tableau :
[1, 2, 3, 4].reduce { |acc, n| acc * n } # 24Pour les opérations pures comme la somme et le produit, Ruby vous offre un raccourci, passez un symbole au lieu d'un bloc :
[1, 2, 3, 4].reduce(:+) # 10
[1, 2, 3, 4].reduce(:*) # 24Une fois que vous savez construire un accumulateur personnalisé, vous pouvez calculer presque n'importe quoi en une seule passe.
Défi
FacileLisez une liste d'entiers séparés par des virgules. Affichez trois lignes :
- La somme (utilisez
reduce(:+)) - Le produit (utilisez
reduce(:*)) - Le maximum, calculé avec
reduceet un bloc explicite, et non en utilisantmax.
Pour l'entrée 2,5,3,8, la sortie est :
18
240
8Aide-mémoire
reduce (alias : inject) réduit un tableau à une seule valeur. Le bloc reçoit un accumulateur et l'élément actuel ; sa valeur de retour devient l'accumulateur suivant.
total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n } # 10Omettez la valeur de départ pour utiliser le premier élément comme accumulateur initial :
[1, 2, 3, 4].reduce { |acc, n| acc * n } # 24Passez un symbole comme raccourci pour des opérations simples :
[1, 2, 3, 4].reduce(:+) # 10
[1, 2, 3, 4].reduce(:*) # 24Essayez vous-même
numbers = gets.chomp.split(",").map(&:to_i)
# À FAIRE : afficher la somme, le produit et le maximum (avec reduce + bloc explicite)
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