はじめに
ジェネレーターに関して整理する.
ジェネレーターとは
yield命令を使ってその時どきの値を返せる関数。
returnでは値を返したらそれで終わりだが、yieldは関数の値を呼び出し元に返した後で
処理を一時停止する。次に呼び出された時にはその時点から処理を再開できる。
実例
素数を求めるジェネレーターの例。
gen_prime.php
function getPrimes()
{
$num = 2;
while (true) {
if (isPrime($num)) {
yield $num;
}
$num++;
}
}
function isPrime(int $num)
{
$prime = true;
for ($i = 2; $i <= floor(sqrt($num)); $i++) {
if ($num % $i === 0) {
$prime = false;
break;
}
}
return $prime;
}
foreach (getPrimes() as $prime) {
if ($prime > 100) {
die();
}
print $prime . ',';
}
// 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,
利点
上記の素数を求める関数を、10万個の素数を求めるように修正した場合
10万個の値を格納できる配列を用意しなければならない。その際、それだけのメモリを消費してしまう。
ジェネレーターを使うとyieldのタイミングでつど値が返されるためメモリの消費もその時どきの状態を監視する最小限で済む。
用途
何かしらのルールに従って値セットを生成する。