本文實例講述了php和C#的yield迭代器實現方法對比。分享給大家供大家參考,具體如下:
yield關鍵字是用來方便實現迭代器的,免去了手工寫迭代器的繁瑣。迭代器常被用來實現協程,所以大部分的協程中都有yield關鍵字,可以參看unity3D的協程。
C#版本:
函數的返回類型必須為 IEnumerable、IEnumerable<T>、IEnumerator 或 IEnumerator<T>。
IEnumerable表示一個類可以迭代,也就是可以用foreach遍歷,IEnumerator是真正的迭代器實現,IEnumerable和IEnumerator一個是使用迭代器的接口,一個是實現迭代器的接口。
C#是怎么用yield實現迭代器的呢?其實是編譯器根據yield關鍵字生成了內部類,反編譯一下就可以看到。
using System.Collections;class Program{ //返回IEnumerable接口,其實返回了編譯器生成的內部類 public static IEnumerable fib(int n) { int cur = 1; int prev = 0; for (int i = 0; i < n; i++) { yield return cur; int temp = cur; cur = prev + cur; prev = temp; } } static void Main() { // Display powers of 2 up to the exponent 8: foreach (int i in fib(9)) { Console.Write("{0} ", i); } }}// prints: 1 1 2 3 5 8 13 21 34
php版本:
函數返回類Generator,而類Generator實現了迭代器接口Iterator。
<?php//返回Iterator接口,php解釋器幫我們返回了Generator類function fib($n){ $cur = 1; $prev = 0; for ($i = 0; $i < $n; $i++) { yield $cur; $temp = $cur; $cur = $prev + $cur; $prev = $temp; }}$fibs = fib(9);foreach ($fibs as $fib) { echo " " . $fib;}// prints: 1 1 2 3 5 8 13 21 34
希望本文所述對大家PHP程序設計有所幫助。
新聞熱點
疑難解答
圖片精選