2016-05-12 14 views
5

私はジェネレータを返す関数を持っています。現時点ではyield fromを使用しています。

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

私はシンプルreturnyield fromが、それはこのケースでは何も変わらないことを交換した場合は?多分実行中ですか?またはパフォーマンスですか? yield fromは新しい '外側'イテレータを生成しますか?

私が知っている他のケースでは、私はそれを数回使用することができ、単純なyieldと混合することもできるので、より柔軟性がありますが、私の場合は問題ありません。

答えて

2

上記のようにメソッドの最後にyield fromを一度使用すると、メソッドから返されるものは変更されません。しかし、メソッド内のコードにはまだ違いがあります。yield fromの前のコードは、イテレータを反復の先頭で巻き戻したときに呼び出されますが、returnより前のコードは関数の呼び出し時に実行されます。これは実際にはyield fromに固有のものではなく、yieldの動作です(証明についてはhttps://3v4l.org/jnPvCを参照してください)。

yield fromの大きな利点は、すべてのイテレータの値を1つのイテレータに結合した関数で複数回使用できることです。