第6章 ユーザー定義関数 / 第3回 模擬試験

PHPのジェネレーターに関する次の記述のうち、正しいものはどれか。

ジェネレーター関数は`yield`キーワードを使って値を返す。 正解
ジェネレーターは呼び出し時に全ての値を一度にメモリ上に生成する。
ジェネレーター関数は通常の関数と全く同じ戻り値の型を持つ。
ジェネレーターは`foreach`で反復処理することができない。
解説
ジェネレーター関数は、通常の`return`の代わりに`yield`キーワードを使って値を1つずつ返す特殊な関数です。呼び出すと`Generator`オブジェクトが返り、`foreach`などで反復処理するたびに、必要な分だけ処理が進んで次の値が生成されます。 他の選択肢が誤りである理由は次の通りです。 ・ジェネレーターは、すべての値を一度にメモリ上へ生成するわけではありません。`foreach`で1件ずつ取り出すたびにその場で値を計算するため、大量データを扱う際のメモリ効率に優れています(通常の配列を返す関数との大きな違いです)。 ・ジェネレーター関数の戻り値は、通常の関数のように任意の型を直接返すのではなく、`Generator`インターフェースを実装したオブジェクトになります(型宣言としては`Generator`や`iterable`を使います)。 ・ジェネレーターは`Iterator`を実装したオブジェクトのため、`foreach`で反復処理できます(これがジェネレーターの主な使い方です)。 例: ``` function range_gen(int $start, int $end): Generator { for ($i = $start; $i <= $end; $i++) { yield $i; } } foreach (range_gen(1, 3) as $n) { echo $n; // 123 } ``` (参照: 独習PHP 第4版 第6章 ユーザー定義関数 6.5節 ジェネレーター p.299〜304)