Procs et Lambdas
Fait partie de la section Logique et Flux du Journey Ruby de Coddy. Leçon 19 sur 56.
Un bloc n’est pas un objet, vous ne pouvez pas le stocker dans une variable. Lorsque vous voulez un morceau de code que vous pouvez transmettre, enregistrer et appeler ultérieurement, vous l’encapsulez dans un Proc ou un lambda.
Un Proc est créé avec Proc.new ou le mot-clé proc. Appelez-le avec .call :
double = proc { |n| n * 2 }
puts double.call(5) # 10
puts double.call(7) # 14Une lambda est similaire, mais plus stricte : elle vérifie que vous transmettez le bon nombre d’arguments. La forme fléchée -> est la notation courante :
square = ->(n) { n * n }
puts square.call(4) # 16
puts square.(4) # 16 (raccourci pour .call)Les deux peuvent être transmis à une méthode qui attend un bloc en les préfixant avec & :
[1, 2, 3].map(&double) # [2, 4, 6]
[1, 2, 3].map(&square) # [1, 4, 9]Utilisez une lambda lorsque vous souhaitez une vérification plus stricte des arguments ; utilisez un Proc lorsque vous souhaitez un comportement plus souple et plus indulgent.
Défi
FacileCréez une lambda nommée tripler qui prend un nombre et le renvoie multiplié par 3.
Lisez ensuite une liste d’entiers séparés par des virgules et affichez, sur des lignes distinctes :
- Le résultat de l’appel à
tripler.call(10) - Les nombres saisis multipliés par 3 (utilisez
map(&tripler)) et joints avec,
Pour l’entrée 1,2,3, la sortie est :
30
3, 6, 9Essayez vous-même
# TODO: définir `tripler` comme un lambda
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: ligne 1, afficher tripler.call(10)
# TODO: ligne 2, mapper numbers avec &tripler, joindre avec ", "
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 - Tisseur de chaînes4Blocs, Procs et Lambdas
Qu'est-ce qu'un bloc ?do..end ou accoladesLe mot-clé yieldParamètres de blocProcs et LambdasRécapitulatif - Itérateur personnalisé7Hashes, 2e partie
Hash.new avec valeurs par défautParcourir les hashesHashes imbriquésFusionner et transformerRécapitulatif - Compteur de fréquences10Projet - Dossiers des étudiants
Présentation du projetAjouter un étudiant2Plages
Qu’est-ce qu’une plage ?Méthodes des plagesPlages dans Case / WhenRécapitulatif - Exercices sur les plages5Puissance des Enumerable
Select et RejectChaînage de MapReduce / Injectcount, all?, any?, none?group_by et partitionsort_by, min_by, max_byRécapitulatif - Pipeline de donnéesEntraînez-vous par vous-même : Compilateur Ruby en ligne