2016-05-12 20 views
5

Mam funkcję, która zwraca generator. W tej chwili korzysta yield from:

function foo() 
{ 
    $generator = getGenerator(); 
    // some other stuff (no yields!) 
    yield from $generator; 
} 

Gdybym zastąpić że yield from z prostym return, czy to coś zmieni w tym przypadku? Może w egzekucji? Lub wydajność? Czy yield from tworzy nowy "zewnętrzny" iterator?

Wiem, w innych przypadkach yield from może być bardziej elastyczny, ponieważ mogę go używać kilka razy, a nawet miksować z prostymi yield s, jednak to nie ma znaczenia w moim przypadku.

Odpowiedz

2

Kiedy używasz yield from raz na końcu metody, tak jak to robisz powyżej, nie zmienia to rzeczy dla tego, co jest zwracane przez metodę. Ale nadal istnieje różnica w kodzie w metodzie: dowolny kod przed wywołaniem yield from jest wywoływany podczas przewijania iteratora na początku iteracji, podczas gdy kod poprzedzający return jest wykonywany podczas wywoływania funkcji, ponieważ ta funkcja jest po prostu normalna funkcja teraz (w rzeczywistości nie jest to specyficzne dla yield from. Jest to zachowanie yield. Zobacz https://3v4l.org/jnPvC dla dowodu).

Wielką zaletą yield from jest to, że można go używać wielokrotnie w funkcji, która połączyła wartości wszystkich iteratorów w pojedynczy iterator.