記錄一次在遞迴中使用 yield 的踩坑

2021-10-09 07:59:33 字數 1400 閱讀 9322

在一次遍歷檔案的時候,想起可以使用「yield」來減少記憶體占用,但很不幸在遞迴中遇到盲區了

<?php

function testrecursion(int $number)

else

}testrecursion(0);

php test.php
很驚訝,var_dump 按道理會輸出 1 到 100,為嘛乙個都不輸出呢?

看來遇到了盲區,為了一**竟,特意請教了群裡的某些大牛,幾番討論之後,豁然開朗

當函式中使用「yield」關鍵字時,不管裡面出現什麼邏輯,都會把整個函式提公升為乙個「生成器」,接下來我們看以下**

<?php

function testrecursion(int $number)

else

}$data = testrecursion(0);

var_dump($data);

php test.php

object(generator)#1 (0)

由此可見,此時的函式已經變成了乙個生成器,如果沒有進行遍歷,不會執行任何**,我們來實踐一下

<?php

function testrecursion(int $number)

else

}$data = testrecursion(0);

foreach($data as $item)

php test.php

int(1)

咦,也不對啊,為啥var_dump只輸出數字1?不是有遞迴的麼?

昂~~其實就是遞迴出了問題,因為遞迴的依然是個生成器,如果沒有任何的遍歷動作,並不會執行任何**。那怎麼辦呢?經過一番操作猛如虎,終於發現還有個神奇的語法「yield from」,來來來,我們再來實踐一下

<?php

function testrecursion(int $number)

else

}$data = testrecursion(0);

foreach($data as $item)

php test.php

int(1)

int(2)

int(3)

int(4)

int(5)

int(6)

int(7)

int(8)

int(9)

int(10)

...

終於完美地解決了問題,看來盲區還真不少哈

關於「yield from」相關的知識,可以參考

php7中生成器的新特性 yield-from

記錄一次oracle使用記錄

使用oracle資料庫的專案到我這邊,需要修改,咱雖然 學過 oracle,但那畢竟已經過去了。哈哈。使用database configuration assistant 建立資料庫,建立快完的時候,說我沒有監聽啥的,然後 通過 net manager 建立了,qizhong1 其中選中的那個就是建...

關於 的一次使用記錄

使用場景 專案裡面在做乙個請求時候發現,不同的請求,有些請求會跳轉到 spring mvc的自定義方法中,有些卻不進去。自定義的方法 class com.zhuanche.car.web.resolver.adminbaseformargumentresolver adminbaseformargu...

Android studio第一次使用記錄

一 建立工程 這邊有模板可以選擇,可以直接選擇empty activity。二 配置 應用名稱 程式包名稱 本地位址 三 進入工程 首先布局layout 上圖各部分收縮省略圖 線性布局命令 linearlayout 插圖 imageview android layout width wrap con...