Ecco un semplice generatore di JavaScript (via: http://blog.carbonfive.com/2013/12/01/hanging-up-on-callbacks-generators-in-ecmascript-6/)Come utilizzare i generatori PHP senza foreach?
function* powGenerator() {
var result = Math.pow(yield "a", yield "b");
return result;
}
var g = powGenerator();
console.log(g.next().value); // "a", from the first yield
console.log(g.next(10).value); // "b", from the second
console.log(g.next(2).value); // 100, the result
Sto cercando di modellare qualcosa di simile con PHP, ma è un po 'di mal di testa.
<?php
function powGenerator() {
return pow((yield 'a'), (yield 'b'));
}
Prima di andare oltre, ottengo questo errore in PHP
Fatal error: Generators cannot return values using "return"
Ok, forse mi limiterò a uso un altro rendimento per ottenere il valore finale fuori? ...
<?php
function powGenerator() {
yield pow((yield 'a'), (yield 'b'));
}
$g = powGenerator(); //=> Generator {#180}
echo $g->send(10); //=> "b"
echo $g->send(2); //=> 100
OK, così ho preso il mio valore schiena, ma ci sono due problemi principali qui
Dove ha fatto il mio
"a"
andare? — Nota nell'esempio JS Sono stato in grado di accedere sia al valore"a"
sia al valore"b"
e al risultato finale100
.Il generatore non è ancora pronto! — devo chiamare
send
un tempo aggiuntivo per completare il generatore$g->valid(); //=> true $g->send('?'); //=> null $g->valid(); //=> false
da PHP Generator::send
public mixed Generator::send (mixed $value)
Sends the given value to the generator as the result of the current
yield
expression and resumes execution of the generator.If the generator is not at a
yield
expression when this method is called, it will first be let to advance to the firstyield
expression before sending the value. As such it is not necessary to "prime" PHP generators with a Generator::next() call (like it is done in Python).
accento sulla "Come tale, non è necessario "prime" Generatori PHP con un Generator::next()
". OK, ma cosa significa veramente? Non devo "innescarlo" come nell'esempio JavaScript, ma anche il primo valore ceduto viene inghiottito.
Qualcuno può spiegare come si intende passare attraverso i generatori senza utilizzando un foreach
?
Ok, l'uso di '' current' e next' è almeno coerente con gli attuali implementazioni di array, ma non essere in grado di specificare la fine di un generatore è davvero stupido, imo. La chiamata extra 'next()' per terminare il generatore rende davvero difficile costruire il proprio passo programmatico attorno a questo. La documentazione fa sembrare che i generatori PHP siano bravi a non dover "innescarli" come fa Python. Hanno comunque finito con un'API goffo. PHP classico. – naomik
Il 'return' in PHP 7 risolve la mia preoccupazione ma in realtà non mi aiuta. PHP 7 probabilmente non sarà stabile per molto, molto tempo. Non riesco a vedere come i generatori esistenti potrebbero essere così miopi. Sembra che sia solo pratico usarli con 'foreach'. – naomik
Comunque, grazie per il tuo aiuto. Continuerò semplicemente con uno stile di programmazione assolutamente imperativo. Questo è praticamente tutto ciò che PHP offre in modo affidabile, comunque. Niente di nuovo in PHP dev e. – naomik