记录一次在递归中使用 yield 的踩坑

本文记录了一次在使用 `yield` 进行递归遍历文件时遇到的问题。作者发现 `yield` 使得函数变为生成器,导致在没有遍历的情况下不执行任何代码。通过深入探讨和实验,作者引入了 `yield from` 语法解决了递归生成器的执行问题,最终成功解决问题。
摘要由CSDN通过智能技术生成

在一次遍历文件的时候,想起可以使用「yield」来减少内存占用,但很不幸在递归中遇到盲区了

一、神奇的空输出

代码

<?php
function testRecursion(int $number)
{
    $number++;
    var_dump($number);
    if ($number < 100) {
        testRecursion($number);
    } else {
        yield $number;
    }
}
testRecursion(0);

运行结果

php test.php

很惊讶,var_dump 按道理会输出 1 到 100,为嘛一个都不输出呢?

二、生成器的前世今生

看来遇到了盲区,为了一探究竟,特意请教了群里的某些大牛,几番讨论之后,豁然开朗

当函数中使用「yield」关键字时,不管里面出现什么逻辑,都会把整个函数提升为一个「生成器」,接下来我们看以下代码

代码

<?php
function testRecursion(int $number)
{

    $number++;
    var_dump($number);
    if ($number < 100) {
        testRecursion($number);
    } else {
        yield $number;
    }
}
$data = testRecursion(0);
var_dump($data);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值