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 相关文章推荐
DOMXML函数笔记
Oct 09 PHP
将时间以距今多久的形式表示,PHP,js双版本
Sep 25 PHP
php启动时候提示PHP startup的解决方法
May 07 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
Jun 26 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
Jun 26 PHP
Laravel框架中扩展函数、扩展自定义类的方法
Sep 04 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
Oct 14 PHP
thinkphp模板赋值与替换实例简述
Nov 24 PHP
php获取QQ头像并显示的方法
Dec 23 PHP
浅析THINKPHP的addAll支持的最大数据量
Feb 03 PHP
PHP实现的数组和XML文件相互转换功能示例
Mar 15 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
Jun 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
PHP获取类中常量,属性,及方法列表的方法
2009/04/09 PHP
PHP中使用unset销毁变量并内存释放问题
2012/07/05 PHP
浅析51个PHP处理字符串的函数
2013/08/02 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
php判断当前用户已在别处登录的方法
2015/01/06 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
JavaScript淡入淡出渐变简单实例
2015/08/06 Javascript
使用OpenLayers3 添加地图鼠标右键菜单
2015/12/29 Javascript
JavaScript原生对象常用方法总结(推荐)
2016/05/13 Javascript
AngularJS模块详解及示例代码
2016/08/17 Javascript
jQuery自适应轮播图插件Swiper用法示例
2016/08/24 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
@angular前端项目代码优化之构建Api Tree的方法
2018/12/24 Javascript
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
python获取标准北京时间的方法
2015/03/24 Python
Python生成随机验证码的两种方法
2015/12/22 Python
Python匹配中文的正则表达式
2016/05/11 Python
python批量替换多文件字符串问题详解
2018/04/22 Python
python实现Zabbix-API监控
2018/09/17 Python
Django实现学员管理系统
2019/02/26 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
python3连接mysql获取ansible动态inventory脚本
2020/01/19 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
幼儿园毕业教师感言
2014/02/21 职场文书
安全生产奖惩制度
2015/08/06 职场文书
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
2021/06/30 SQL Server