A diferença entre return
e yield
parecia clara até que eu descobri que havia também yield from
e a possibilidade de combinar as duas return
e yield
na mesma função!
Meu entendimento return
era de que tudo o que havia depois não foi executado, certo?
Contudo:
function generate(): iterable {
return [1, 2, 3];
}
foreach (generate() as $value) {
echo $value;
}
Produz: "123"
Mas o seguinte:
function generate(): iterable {
return [1, 2, 3];
yield;
}
foreach (generate() as $value) {
echo $value;
}
Não produz nada! Então isso significa que o rendimento é executado?
Isso é um inseto?
var_dump(generate()->GetReturn());
Respostas:
Return
Simplesmente devolve um valor único ao chamador.
Yield
Transforme a função / método atual para retornar a
Generator
, que produzirá mais que um valor único: sempre queyield
acionado, ele atribui o valor ao chamador, um de cada vez, tradicionalmente usando umforeach
loop.Yield
+Return
Os geradores, além de gerar valores, também podem fornecer um valor retornado exclusivo. Esse valor não fará parte do loop ao redor do gerador, deve ser acessado usando o
Generator::getReturn()
métodoReturn
+Yield
Isso pode ser visto como um bug, no entanto, não é.
São duas fases:
generate()
função contém ayield
palavra-chave e, portanto, é marcada como produzindo aGenerator
.return
acontece antes doyield
, o gerador não tem a chance de produzir nenhum valor. No entanto, a[1, 2, 3]
matriz pode ser recuperada comGenerator::getReturn()
.Um exemplo completo anotado:
fonte
A partir da documentação :
Portanto, não importa se o
yield
arquivo é executado, o analisador o vê em algum lugar na definição da função e o transforma em um gerador.Se a função nunca executar a
yield
instrução, o gerador não produzirá nenhum valor. O valor retornado porreturn
é ignorado quando você tenta usar o resultado. A documentação diz:Então você poderia fazer:
fonte