匿名ジェネレータ


最近、匿名のジェネレータを作りたかったです.良いニュースは可能ですが、構文は最も明白なものではありません.
jQuery時代のJavaScriptから主に知られている「即時起動関数式」と呼ばれるテクニックを使用する必要があります.
はい、
$iterable = (function (): Generator {
  yield 42; // yield any number of values
})();
解説
  • 匿名関数自体はジェネレータではなく、呼び出し可能であり、
  • この関数は、作成された直後に呼び出され、括弧で囲まれなければなりません(function(){ ... })() 我々がすぐにそれを起こしたいならば
  • 呼び出しが発生すると、ジェネレータは
  • $func = function(): Generator { yield 42; };
    $iterable = $func(); // this is when the generator is created
    
    foreach($func as $item){ }     // error, $foo is not iterable
    foreach($iterable as $item){ } // iterates over the generator
    
    ジェネレータは、PHP5.5 . 私はこれまでめったに使用しませんでした、しかし、彼らはいくつかのエッジケースを解決するのに良いです.
    ジェネレータを使用して、以下のコードを置き換えることができます.はい、2つのアイテムのためにそれは役に立たないかもしれません、しかし、そのような複数の抽出者のためにそれは意味をなします.特に最初の抽出物のみが99 %のケースで使用されることを知っているとき.
    function getDefaultExtractors(
      string $headerName, 
      string $cookieName
    ): iterable {
      #<  code here  >#
      return $extractors;
    }
    
    コードウィズif sとarray push :
    $extractors = [];
    if ($headerName !== null) {
      $extractors[] = Make::headerExtractor($headerName);
    }
    if ($cookieName !== null) {
      $extractors[] = Make::cookieExtractor($cookieName);
    }
    
    コードウィズarray_filter とternaries :
    $extractors = array_filter([
      $headerName !== null ? Make::headerExtractor($headerName) : null,
      $cookieName !== null ? Make::cookieExtractor($cookieName) : null,
    ]);
    
    ジェネレータを使用したコード
    $extractors = (function () use ($headerName, $cookieName): Generator {
      $headerName !== null && yield Make::headerExtractor($headerName);
      $cookieName !== null && yield Make::cookieExtractor($cookieName);
    })(),
    
    発電機の背後にある鍵となる考えは、実行が実際に各々の上で休止されるということですyield ステートメントを実行します.生成された項目の全てが消費される前に反復が中断される場合、これはいくつかの計算リソースを節約する.