Yield (instruction)
Le yield est une instruction de programmation qui sert à imposer la constructivité d'une fonction. Elle est plus souvent présente dans les langages à haut niveau comme Python, Ruby ou le C#. Son utilisation dans une fonction permet de retourner un générateur. Dans le cas du python, appeler la méthode next() de ce générateur exécutera la fonction et retournera une valeur. Le yield procède comme un return au détail près que cette fonction est liée à un générateur et que le prochain appel de la méthode next() reprendra l'exécution là où elle en était.
Pour les articles homonymes, voir Yield.
Exemple en langage C#
En C#, le mot-clé yield
est suivi de return
pour retourner la valeur suivante ou break
pour interrompre l'itération.
using System.Collections.Generic;
public class Mots
{
// Tableau contenant des mots :
public string[] mots;
// Constructeur
public Mots(params string[] mots)
{ this.mots = mots; }
// Énumérer tous les mots jusqu'à trouver
// le mot contenu dans le paramètre dernier (exclu)
// ou la fin du tableau.
public IEnumerable<string> TousLesMotsJusquA(string dernier)
{
foreach(string mot in mots)
if (mot.Equals(dernier)) yield break; // fin prématurée de l'itération
else yield return mot; // élément de l'itération
// fin normale de la boucle d'itération
}
}
public class TestProgram
{
public static void Main()
{
Mots fruits = new Mots( "pomme", "poire", "abricot", "fraise", "kiwi" );
foreach( string fruit in fruits.TousLesMotsJusquA("fraise") )
Console.WriteLine( fruit );
}
}
Exemple en langage Python
def fonction(max):
print('début fonction')
for x in range(0, max+1):
yield x
print('incrémente x')
gen = fonction(2)
gen.next()
# début fonction
# 0
gen.next()
# incrémente x
# 1
Exemple en langage Ruby
En Ruby, l'opérateur yield va entrainer l'exécution du bloc de code passé en paramètre :
def delimit
puts "before yield"
yield if block_given?
puts "after yield"
end
delimit{ puts "in yield" } #=> "before yield\n" "in yield\n" "after yield\n"