Oto prosty generator JavaScript (przez: http://blog.carbonfive.com/2013/12/01/hanging-up-on-callbacks-generators-in-ecmascript-6/)Jak korzystać z generatorów PHP bez 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
Próbuję modelować coś podobnego z PHP, ale jest to trochę z bólem głowy.
<?php
function powGenerator() {
return pow((yield 'a'), (yield 'b'));
}
Zanim pójdę dalej, mam ten błąd w PHP
Fatal error: Generators cannot return values using "return"
Ok, więc może ja po prostu użyć innego wydajność, aby uzyskać ostateczną wartość out? ...
<?php
function powGenerator() {
yield pow((yield 'a'), (yield 'b'));
}
$g = powGenerator(); //=> Generator {#180}
echo $g->send(10); //=> "b"
echo $g->send(2); //=> 100
OK, więc mam z powrotem moje wartości, ale nie ma tu dwa główne problemy
Skąd mój
"a"
iść? — Zauważ, że w przykładzie JS mogłem uzyskać dostęp zarówno do uzyskanych wartości"a"
, jak i"b"
, a także do końcowego wyniku100
.Generator wciąż nie jest gotowy! — Muszę zadzwonić
send
dodatkowego czasu na wykonanie generatora$g->valid(); //=> true $g->send('?'); //=> null $g->valid(); //=> false
Od 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).
nacisk na „Jako takie nie jest konieczne do "prime" Generatory PHP z Generator::next()
". OK, ale co to naprawdę znaczy? Nie muszę "zaliczyć" go tak, jak przykład JavaScriptu, ale pierwsza uzyskana wartość również zostaje połknięta.
Czy ktoś może wyjaśnić, w jaki sposób ma przejść przez generatory bez przy użyciu foreach
?
Ok, użycie '' next' current' i jest co najmniej zgodne z istniejącymi implementacje tablic, ale niemożność określenia końca generatora jest naprawdę głupia, imo. Dodatkowe wywołanie 'next()' w celu zakończenia generatora sprawia, że naprawdę trudno jest zbudować własne programowe przechodzenie wokół tego. Dokumentacja sprawia, że brzmi to tak, jakby generatory PHP świetnie się nie musiały "zagruntować" tak, jak robi to Python. W każdym razie kończą się przylegającym API. Klasyczny PHP. – naomik
"Zwrot" w PHP 7 rozwiązuje mój problem, ale tak naprawdę nie pomaga mi to. PHP 7 prawdopodobnie nie będzie stabilne przez długi, długi czas. Nie rozumiem, jak istniejące generatory mogą być tak krótkowzroczne. Wydaje się, że praktyczne jest użycie ich z 'foreach'. – naomik
W każdym razie, dziękuję za pomoc. Będę trzymać się absolutnie imperatywnego stylu programowania. W zasadzie to wszystko, co PHP zapewnia mi niezawodnie. Nic nowego w PHP dev i. – naomik