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
通过ICQ网关发送手机短信的PHP源程序
Oct 09 PHP
实时抓取YAHOO股票报价的代码
Oct 09 PHP
模拟flock实现文件锁定
Feb 14 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
Jun 25 PHP
PHP中的按位与和按位或操作示例
Jan 27 PHP
php析构函数的简单使用说明
Aug 24 PHP
PHP连接数据库实现注册页面的增删改查操作
Mar 27 PHP
php array_multisort 对数组进行排序详解及实例代码
Oct 27 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
Apr 20 PHP
laravel-admin的图片删除实例
Sep 30 PHP
PHP中通过getopt解析GNU C风格命令行选项
Nov 18 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
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
Yii2.0中使用js异步删除示例
2017/03/10 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
js对文章内容进行分页示例代码
2014/03/05 Javascript
AngularJS基础学习笔记之表达式
2015/05/10 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
Javascript实现简易天数计算器
2020/05/18 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
[01:15:29]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第三局
2016/03/04 DOTA
Python完全新手教程
2007/02/08 Python
python连接mysql调用存储过程示例
2014/03/05 Python
Python实现控制台进度条功能
2016/01/04 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
2018/02/07 Python
python中使用print输出中文的方法
2018/07/16 Python
Linux下多个Python版本安装教程
2018/08/15 Python
python 顺时针打印矩阵的超简洁代码
2018/11/14 Python
Python创建字典的八种方式
2019/02/27 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
sklearn-SVC实现与类参数详解
2019/12/10 Python
django model通过字典更新数据实例
2020/04/01 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
西班牙品牌鞋子、服装和配饰在线商店:Esdemarca
2021/02/17 全球购物
Linux中如何设置Java环境变量(Ubuntu)
2016/07/24 面试题
日语翻译个人求职的自我评价
2013/10/14 职场文书
研究生自我鉴定范文
2013/10/30 职场文书
学校端午节活动方案
2014/08/23 职场文书
七一讲话心得体会
2014/09/05 职场文书
创建文明城市倡议书
2015/04/28 职场文书
毕业实习证明范本
2015/06/16 职场文书
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android
MySQL事务的ACID特性以及并发问题方案
2022/07/15 MySQL