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读取PDF内容配合Xpdf的使用
Nov 24 PHP
PHP笔记之:日期函数的使用介绍
Apr 24 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
Aug 21 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
Jun 17 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
Jul 21 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
May 29 PHP
php调用云片网接口发送短信的实现方法
Oct 25 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
PHP实现数组根据某个单元字段排序操作示例
Aug 01 PHP
PHP实现微信退款功能
Oct 02 PHP
PHP让网站移动访问更加友好方法
Feb 14 PHP
PHP中quotemeta()函数的用法讲解
Apr 04 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
PHP连接access数据库
2008/03/27 PHP
PHP可逆加密/解密函数分享
2012/09/25 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
使用JavaScript获取Request中参数的值方法
2016/09/27 Javascript
原生JS查找元素的方法(推荐)
2016/11/22 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
Layer+Echarts构建弹出层折线图的方法
2019/09/25 Javascript
vue.js 子组件无法获取父组件store值的解决方式
2019/11/08 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
2020/07/28 Javascript
Python写的创建文件夹自定义函数mkdir()
2014/08/25 Python
Python实现把xml或xsl转换为html格式
2015/04/08 Python
常用python编程模板汇总
2016/02/12 Python
使用Python实现简单的服务器功能
2017/08/25 Python
python opencv检测目标颜色的实例讲解
2018/04/02 Python
Python比较配置文件的方法实例详解
2019/06/06 Python
详解python中的lambda与sorted函数
2020/09/04 Python
Python如何执行系统命令
2020/09/23 Python
纯CSS3制作漂亮带动画效果的主机价格表
2015/04/25 HTML / CSS
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
家长给老师的道歉信
2014/01/13 职场文书
中文专业学生自我评价范文
2014/02/06 职场文书
平面设计求职信
2014/03/10 职场文书
出纳试用期自我鉴定
2014/04/07 职场文书
倡议书范文格式
2014/05/12 职场文书
2014年安全生产责任书
2014/07/22 职场文书
python文件名批量重命名脚本实例代码
2021/04/22 Python
实操Python爬取觅知网素材图片示例
2021/11/27 Python