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 _autoload自动加载类与机制分析
Feb 10 PHP
PHP中几个常用的魔术常量
Feb 23 PHP
PHP 线程安全与非线程安全版本的区别深入解析
Aug 06 PHP
简单的php文件上传(实例)
Oct 27 PHP
二进制交叉权限微型php类分享
Feb 07 PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
Apr 08 PHP
php中的curl_multi系列函数使用例子
Jul 29 PHP
php结合md5实现的加密解密方法
Jan 25 PHP
PHP简单判断手机设备的方法
Aug 23 PHP
php将print_r处理后的数据还原为原始数组的解决方法
Nov 02 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
thinkPHP框架自动填充原理与用法分析
Apr 03 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+mysql实现数据库随机重排实例
2014/10/17 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
2016/03/17 PHP
PHP生成指定范围内的N个不重复的随机数
2019/03/18 PHP
javascript实现的使用方向键控制光标在table单元格中切换
2010/11/17 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
使用jQuery避免鼠标双击的解决方案
2013/08/21 Javascript
javascript数组去重方法终极总结
2014/06/05 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
2016/12/24 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
浅谈Vue SSR 的 Cookies 问题
2017/11/20 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
2018/08/27 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
python中数据库like模糊查询方式
2020/03/02 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
2020/09/15 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
html5中的input新属性range使用记录
2014/09/05 HTML / CSS
HTML5 画布canvas使用方法
2016/03/18 HTML / CSS
大学应届生求职简历的自我评价
2013/10/08 职场文书
市场开发与营销专业求职信
2013/12/31 职场文书
向领导表决心的话
2014/03/11 职场文书
大学生党员自我评价范文
2014/04/09 职场文书
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
产品质量保证书
2014/04/29 职场文书
党员四风剖析材料
2014/08/27 职场文书
商铺租房协议书范本
2014/12/04 职场文书
担保书范文
2019/07/09 职场文书
PHP实现创建以太坊钱包转账等功能
2021/04/21 PHP
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python
vue实现列表垂直无缝滚动
2022/04/08 Vue.js