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 Pear 安装及使用
Mar 19 PHP
php中获得视频时间总长度的另一种方法
Sep 15 PHP
php文件服务实现虚拟挂载其他目录示例
Apr 17 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
Oct 23 PHP
php隐藏IP地址后两位显示为星号的方法
Nov 21 PHP
PHP实现搜索相似图片
Sep 22 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
Oct 18 PHP
PHP重定向与伪静态区别
Feb 19 PHP
PHP 数组黑名单/白名单实例代码详解
Jun 04 PHP
PHP中define() 与 const定义常量的区别详解
Jun 25 PHP
tp5.1框架数据库子查询操作实例分析
May 26 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
解析link_mysql的php版
2013/06/30 PHP
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
php文件上传及下载附带显示文件及目录功能
2017/04/27 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
2017/05/30 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
tp5实现微信小程序多图片上传到服务器功能
2018/07/16 PHP
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
ES6入门教程之变量的解构赋值详解
2019/04/13 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
[02:47]2018年度DOTA2最佳辅助位选手4号位-完美盛典
2018/12/17 DOTA
使用python编写脚本获取手机当前应用apk的信息
2014/07/21 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
2016/06/29 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
Django REST framework 视图和路由详解
2019/07/19 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
Python tkinter常用操作代码实例
2020/01/03 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
2021/01/23 Python
Snapfish英国:在线照片打印和个性化照片礼品
2017/01/13 全球购物
GAP阿联酋官网:GAP UAE
2017/11/30 全球购物
老板电器官方购物商城:老板油烟机、燃气灶、消毒柜、电烤箱
2018/05/30 全球购物
int *p=NULL和*p= NULL有什么区别
2014/10/23 面试题
药学专业个人的自我评价
2013/12/31 职场文书
2014大学生全国两会学习心得体会
2014/03/13 职场文书
员工安全承诺书
2014/05/22 职场文书
环卫处个人工作总结
2015/03/04 职场文书
教师师德工作总结2015
2015/07/22 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
详解Python函数print用法
2021/06/18 Python
MySQL快速插入一亿测试数据
2021/06/23 MySQL
收音机爱好者玩机13年,简评其使用过的19台收音机
2022/04/30 无线电