gpt4 book ai didi

php - 在 PHP : what is the difference between "return", "yield", "yield from"中,在同一个函数中混合了 yield 和 return?

转载 作者:行者123 更新时间:2023-12-03 11:21:03 30 4
gpt4 key购买 nike

return的区别和 yield似乎很清楚,直到我发现还有 yield from以及将两者结合起来的可能性 returnyield在完全相同的功能!

我对return的理解之后的一切都是 不是 执行了,对吗?

然而:

function generate(): iterable {
return [1, 2, 3];
}

foreach (generate() as $value) {
echo $value;
}

产生:“123”

但以下内容:
function generate(): iterable {
return [1, 2, 3];
yield;
}

foreach (generate() as $value) {
echo $value;
}

什么都不生产!所以这意味着yield被执行了?

这是一个错误吗?

最佳答案

Return
简单地给调用者一个唯一的值。
Yield
转换当前函数/方法以返回 Generator ,这将产生多个唯一值:每次 yield被触发,它给调用者一个值,一次一个,传统上使用 foreach环形。
Yield + Return
生成器除了生成值外,还可以提供唯一的返回值。该值不会成为围绕生成器的循环的一部分,必须使用 Generator::getReturn() 访问它方法。
Return + Yield
这可能被视为一个错误,但事实并非如此。

它们是两个阶段:

  • 从代码到字节码 :在这个阶段,generate()函数被视为包含 yield关键字,因此被标记为产生 Generator .
  • 执行 : 因为return恰好在yield之前,生成器没有机会产生任何值。然而,[1, 2, 3]可以使用 Generator::getReturn() 检索数组.

  • 一个完整的注释示例:
    // Generate integers 1 and 2
    function generateIntegers1And2(): Generator {
    yield 1; // <--+ <--+ <--+
    yield 2; // <-+ <-+ <-+
    } // | | |
    // | | |
    foreach (generateIntegers1And2() as $value) { // | | |
    var_dump($value); // Shows 1, then 2 ->* | |
    } // | |
    // | |
    function generateOuterYield(): Generator { // | |
    // Yields the generator *itself* returned by | |
    // generateIntegers1And2() not the actual values | |
    // generated by it. | |
    // This means we are producing here a generator | |
    // of generator of integers. | |
    yield generateIntegers1And2(); // <-+ | |
    } // | | |
    // | | |
    foreach (generateOuterYield() as $value) { // | | |
    var_dump($value); // ->* | |
    // The two levels of imbrication means we have | |
    // to loop once more to actually consume | |
    // generateIntegers1And2 | |
    foreach ($value as $val) { // | |
    var_dump($val); // Shows 1, then 2 ->* |
    } // |
    } // |
    // |
    // A generator can just be returned as-is: |
    function generateOuterReturn(): Generator { // |
    return generateIntegers1And2(); // |
    } // |
    // |
    // it doesn't change the way it is consumed |
    foreach (generateOuterReturn() as $value) { // |
    var_dump($value); // Shows 1, then 2 |
    } // |
    // |
    function generateOuterYieldFrom(): Generator { // |
    // First yield values generated by generateIntegers1And2() |
    yield from generateIntegers1And2(); // *<---+
    // then yield integers 3 |
    yield 3; // <--+
    // and 4 |
    yield 4; // <-+
    } // |
    // |
    foreach (generateOuterYieldFrom() as $value) { // |
    var_dump($value); // Shows 1, 2, 3 and 4 ->*
    }

    function generateIntegers56AndReturn(): Generator {
    yield 5; // <---+
    yield 6; // <--+
    // |
    return ["five", "six"]; // <--+ |
    } // | |
    // | |
    $gen = generateIntegers56AndReturn(); // | |
    // | |
    // Consume the values **yielded** by | |
    // generateIntegers56AndReturn() | |
    foreach ($gen as $value) { // | |
    var_dump($value); // Shows 5, then 6 | ->*
    } // |
    // |
    // Access the value **returned** by the generator |
    var_dump($gen->getReturn()); // ->*

    function wtf(): Generator {
    return ["W", "T", "F", "!"];
    // Without the following line, PHP would complain with a TypeError:
    // Return value of wtf() must be an instance of Generator, array returned.
    // The presence of a yield keyword anywhere inside the function makes it a Generator.
    // However, since we return *before* reaching any *yield*, 42 is never yielded.
    // This is empty generator!
    yield 42;
    }

    $gen = wtf();

    // This foreach loop is not entered!
    foreach ($gen as $value) {
    var_dump($value);
    }

    // However, we can loop on the array *returned* by wtf():
    foreach ($gen->getReturn() as $value) {
    echo $value; // Will print: WTF!
    }

    关于php - 在 PHP : what is the difference between "return", "yield", "yield from"中,在同一个函数中混合了 yield 和 return?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60232298/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com