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

在一次遍历文件的时候,想起可以使用「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);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值