php和C#的yield迭代器实现方法对比分析


Posted in PHP onJuly 17, 2019

本文实例讲述了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程序设计有所帮助。

PHP 相关文章推荐
高亮度显示php源代码
Oct 09 PHP
社区(php&amp;&amp;mysql)六
Oct 09 PHP
PHP3 safe_mode 失效漏洞
Oct 09 PHP
用PHP的ob_start() 控制您的浏览器cache
Aug 03 PHP
PHP中的strtr函数使用介绍(str_replace)
Oct 20 PHP
php记录代码执行时间(实现代码)
Jul 05 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
Jan 07 PHP
PHP动态柱状图实现方法
Mar 30 PHP
php时间函数用法分析
May 28 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
Dec 10 PHP
php获取ajax的headers方法与内容实例
Dec 27 PHP
php框架CodeIgniter主从数据库配置方法分析
May 25 PHP
php基于协程实现异步的方法分析
Jul 17 #PHP
php学习笔记之字符串常见操作总结
Jul 16 #PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
Jul 15 #PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
Jul 12 #PHP
php array_chunk()函数用法与注意事项
Jul 12 #PHP
laravel框架中间件 except 和 only 的用法示例
Jul 12 #PHP
Laravel框架实现多数据库连接操作详解
Jul 12 #PHP
You might like
比file_get_contents稳定的curl_get_contents分享
2012/01/11 PHP
php redis实现文章发布系统(用户投票系统)
2017/03/04 PHP
在IE上直接编辑网页内容的js代码(IE地址栏js)
2009/04/27 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
jquery左右全屏大尺寸多图滑动效果代码分享
2015/08/28 Javascript
一览画面点击复选框后获取多个id值的方法
2016/05/30 Javascript
js实现登录验证码
2016/12/22 Javascript
jQuery实现最简单实用的分秒倒计时
2017/02/05 Javascript
bootstrap switch开关组件使用方法详解
2017/08/22 Javascript
vue项目刷新当前页面的三种方法
2018/12/04 Javascript
angularjs请求数据的方法示例
2019/08/06 Javascript
小程序实现层叠卡片滑动效果
2019/08/26 Javascript
layer.prompt输入层的例子
2019/09/24 Javascript
解决vant-UI库修改样式无效的问题
2020/11/03 Javascript
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
Python实现把xml或xsl转换为html格式
2015/04/08 Python
深入探究Django中的Session与Cookie
2017/07/30 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
使用tensorflow实现线性回归
2018/09/08 Python
Django实现学员管理系统
2019/02/26 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
Python Request类源码实现方法及原理解析
2020/08/17 Python
python 两种方法删除空文件夹
2020/09/29 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
canvas里面如何基于随机点绘制一个多边形的方法
2018/06/13 HTML / CSS
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
SmartBuyGlasses美国官网:太阳眼镜和眼镜
2017/08/20 全球购物
教师实习期自我鉴定
2013/10/06 职场文书
心理健康日活动总结
2014/05/08 职场文书
自强自立美德少年事迹材料
2014/08/16 职场文书
计划生育诚信协议书
2014/11/02 职场文书
廉政承诺书范文
2015/04/28 职场文书
python Django框架快速入门教程(后台管理)
2021/07/21 Python
css3 选择器
2022/05/11 HTML / CSS