Le mot-clé yield
Fait partie de la section Logique et Flux du Journey Ruby de Coddy — leçon 17 sur 56.
Les méthodes que vous définissez vous-même peuvent prendre un bloc, tout comme les méthodes intégrées. À l'intérieur de la méthode, le mot-clé yield exécute le bloc transmis par l'appelant.
def greet
puts "Before block"
yield
puts "After block"
end
greet do
puts "Hi from the block!"
end
# Before block
# Hi from the block!
# After blockVous pouvez passer des arguments au bloc en les transmettant à yield :
def with_each(items)
items.each { |item| yield item }
end
with_each([10, 20, 30]) { |n| puts n }
# 10
# 20
# 30Si une méthode appelle yield mais que l'appelant n'a pas passé de bloc, Ruby lève une erreur. block_given? vous permet de vérifier d'abord :
def maybe
yield if block_given?
end
maybe # il ne se passe rien
maybe { puts "called!" } # appelé !Défi
FacileDéfinissez une méthode nommée repeat qui prend un argument n (un entier) et transmet (yield) les valeurs 1, 2, ..., n à son bloc, une par une.
Ensuite, appelez votre méthode avec n = 4 et un bloc qui affiche "Got <value>" pour chaque valeur transmise.
La sortie est :
Got 1
Got 2
Got 3
Got 4Aide-mémoire
Utilisez yield à l'intérieur d'une méthode pour exécuter le bloc passé par l'appelant :
def greet
yield
end
greet { puts "Hi!" } # Hi!Passez des arguments au bloc via yield :
def with_each(items)
items.each { |item| yield item }
end
with_each([1, 2]) { |n| puts n }Utilisez block_given? pour vérifier si un bloc a été fourni avant d'appeler yield :
def maybe
yield if block_given?
endEssayez vous-même
# TODO: définir `repeat` qui transmet 1..n à son bloc
# TODO: appeler repeat(4) avec un bloc qui affiche "Got <value>"
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