La différence entre return
et yield
semblait claire jusqu'à ce que je comprenne qu'il y avait aussi yield from
et la possibilité de combiner les deux return
et yield
dans la même fonction!
D' return
après ce que je comprends, tout ce qui s'est passé n'a pas été exécuté, n'est-ce pas?
Toutefois:
function generate(): iterable {
return [1, 2, 3];
}
foreach (generate() as $value) {
echo $value;
}
Produit: "123"
Mais ce qui suit:
function generate(): iterable {
return [1, 2, 3];
yield;
}
foreach (generate() as $value) {
echo $value;
}
Ne produit rien! Cela signifie donc que le rendement est exécuté?
Est-ce un bug?
var_dump(generate()->GetReturn());
Réponses:
Return
Redonne simplement une valeur unique à l'appelant.
Yield
Transformez la fonction / méthode actuelle pour renvoyer a
Generator
, qui produira plus qu'une valeur unique: à chaqueyield
déclenchement, elle donne la valeur à l'appelant, une à la fois, en utilisant traditionnellement uneforeach
boucle.Yield
+Return
Les générateurs, en plus de générer des valeurs, peuvent également fournir une valeur renvoyée unique. Cette valeur ne fera pas partie du bouclage autour du générateur, elle doit être accessible en utilisant la
Generator::getReturn()
méthode.Return
+Yield
Cela pourrait être vu comme un bug, mais ce n'est pas le cas.
Ce sont deux phases:
generate()
fonction est vue comme contenant leyield
mot - clé, elle est donc marquée comme produisant unGenerator
.return
se trouve avant leyield
, le générateur n'a pas la possibilité de produire de valeur. Cependant, le[1, 2, 3]
tableau peut être récupéré avecGenerator::getReturn()
.Un exemple annoté complet:
la source
De la documentation :
Peu importe que le
yield
soit exécuté, l'analyseur le voit quelque part dans la définition de la fonction et le transforme en générateur.Si la fonction n'exécute jamais l'
yield
instruction, le générateur ne produit aucune valeur. La valeur renvoyée parreturn
est ignorée lorsque vous essayez d'utiliser le résultat. La documentation dit:Vous pourriez donc faire:
la source