Menu
Coddy logo textTech

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 block

Vous 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
# 30

Si 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é !
challenge icon

Défi

Facile

Dé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 4

Aide-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?
end

Essayez vous-même

# TODO: définir `repeat` qui transmet 1..n à son bloc

# TODO: appeler repeat(4) avec un bloc qui affiche "Got <value>"
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