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)