Open5

速習ジェネレータ

にゃんだーすわんにゃんだーすわん

ジェネレータとはなんでしょうか。PHPマニュアルにも書いてあります。

読みましたね。わかりましたか? おめでとうございます。あなたは今日からジェネレータ完全マスターだ!

速習ジェネレータ・完

ご愛読ありがとうございました。tadsanの次回作にご期待ください!

にゃんだーすわんにゃんだーすわん

ちょっと待てよと、あなたはジェネレータについて検索してもよくわからなかったのでこの記事を訪れたはずです。

わかりました。もっと具体的な説明からジェネレータの特徴を解き明かしていきましょう。


ジェネレータはこういうものです。

  • 関数定義の中で yield って書くとジェネレータ関数になる
  • ジェネレータ関数を実行した結果に返されるものがジェネレータだ
  • ジェネレータは foreach できる配列みたいなやつだ

ここでは関数といっていますが、無名関数でもクロージャでもメソッドでも何でもOKです。

定義だけ見せられてもわかったようなわかってないような感じだと思うので、一個ジェネレータを作ってみましょう。

にゃんだーすわんにゃんだーすわん

「配列みたいなやつだ」というからには、配列と同じデータもジェネレータを使って表現できるということです。

なので、まず [1, 2, 3] という配列と同じ意味のジェネレータ関数を定義してみましょう。

$f = function () {
    yield 1;
    yield 2;
    yield 3;
};

はい、これでジェネレータの完成です。

さっそく呼び出してみましょう。

foreach ($f() as $n) {
    var_dump($n);
}

foreachでいきなり$f()とか書くのが見慣れない感じがします。

動作確認: https://3v4l.org/sD417

動いてそうですね!

にゃんだーすわんにゃんだーすわん

yield は連想配列みたいにも書けます。

['a' => 1, 'b' => 2, 'c' => 3] という連想配列みたいなジェネレータはこうです。

<?php

$f = function () {
    yield 'a' => 1;
    yield 'b' => 2;
    yield 'c' => 3;
};

foreach ($f() as $key => $value) {
    var_dump("{$key}: {$value}");
}

よさそう。

にゃんだーすわんにゃんだーすわん

いや、待ってほしい。

配列でできるなら、なんでジェネレータとかいうめんどくさい概念を持ち出すんだろう。

ここで、配列にできること、ジェネレータにできることをまとめてみましょう。

(WIP)