¡La diferencia entre return
y yield
parecía clara hasta que descubrí que también existía yield from
y la posibilidad de combinar ambos return
y yield
en la misma función!
Mi comprensión de return
fue que todo después no fue ejecutado, ¿verdad?
Sin embargo:
function generate(): iterable {
return [1, 2, 3];
}
foreach (generate() as $value) {
echo $value;
}
Produce: "123"
Pero lo siguiente:
function generate(): iterable {
return [1, 2, 3];
yield;
}
foreach (generate() as $value) {
echo $value;
}
¡No produce nada! Entonces, ¿eso significa que el rendimiento se ejecuta?
¿Es esto un error?
var_dump(generate()->GetReturn());
Respuestas:
Return
Simplemente devuelve un valor único a la persona que llama.
Yield
Transforme la función / método actual para devolver a
Generator
, lo que producirá más que un valor único: cada vez queyield
se activa, le da el valor a la persona que llama, uno a la vez, tradicionalmente usando unforeach
bucle.Yield
+Return
Los generadores, además de generar valores, también pueden proporcionar un valor devuelto único. Ese valor no será parte del bucle alrededor del generador, debe accederse a él utilizando el
Generator::getReturn()
métodoReturn
+Yield
Esto podría verse como un error, sin embargo, no lo es.
Son dos fases:
generate()
se ve que la función contiene layield
palabra clave, por lo tanto se marca como produciendo aGenerator
.return
sucede antes que elyield
, el generador no tiene la posibilidad de producir ningún valor. Sin embargo, la[1, 2, 3]
matriz se puede recuperar conGenerator::getReturn()
.Un ejemplo completo anotado:
fuente
De la documentación :
Por lo tanto, no importa si
yield
se ejecuta, el analizador lo ve en algún lugar de la definición de la función y lo convierte en un generador.Si la función nunca ejecuta la
yield
declaración, entonces el generador no produce ningún valor. El valor devuelto porreturn
se ignora cuando intenta utilizar el resultado. La documentación dice:Entonces podrías hacer:
fuente