• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >ruby > ruby 迭代器使用方法

ruby 迭代器使用方法

作者: 字体:[增加 减小] 来源:互联网

通过本文主要向大家介绍了迭代器的使用方法,ruby使用,ruby如何使用,迭代器的使用,java中迭代器的使用等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
迭代器并不是Ruby发明的.它广泛地运用于各种面向对象语言.在Lisp中也有,只是不这么叫罢了.尽管如此,迭代器的概念并不为许多人熟悉,因此我们将在此做较为详细的介绍.

你知道,动词 iterate 的意思是做同一件事许多遍,因此,iterator就是用来将同一件事做许多次的东西.

当我们写代码时,我们需要各种环境下的循环.在C里,我们用for或者while.比如,

char *str;
for (str = "abcdefg"; *str != '\0'; str++) {
  /* process a character here */
} 


C的for(...)语法提供了一种写循环的抽象方法,但测试 *str 是否为空(null)字符需要程序员了解字符串内部结构的细节.这让C看起来像低级(low-level)语言.更高级的语言是通过它们更具弹性的迭代器支持来实现的.考虑下面的 sh 命令行脚本:

#!/bin/sh
for i in *.[ch]; do  
      # ... here would be something to do for each file
done 


当前目录下所有的C源文件和头文件都将被处理,由命令行shell来一个个地捡取文件名并处理其中的细节.我想这是在比 C 要高的级别上工作,你觉得呢?

但有更多值得我们考虑的:在一种语言能够很好的给内建的数据类型的提供迭代器的同时,我们却仍需要回去用低级别的循环语言来实现对自己定义的数据类型的迭代,这真是让人失望.在面对对象编程时,用户经常一个接一个地定义数据类型,因此这是一个很严重的问题.

因此,所有的OOP语言都包含了一定的迭代器机制.某些语言为此提供一种特殊的类;Ruby则允许我们直接定义迭代器.

Ruby的String类型有很多有用的迭代器:

ruby> "abc".each_byte{|c| printf "<%c>", c}; print "\n"
<a><b><c>
   nil 


each_byte 是个用于字符串中每个字符的迭代器.每个字符串由局部变量c代替.这可以翻译为类似C的代码...

ruby> s="abc";i=0
   0
ruby> while i<s.length
    |    printf "<%c>", s[i]; i+=1
    | end; print "\n"
<a><b><c>
   nil 


...然而, each_byte 迭代器在概念上要简单些,而且即使以后 String 类突然有所改变也应该可以照样工作.使用迭代器的一个好处便是在此类改变中仍然可以保持健壮;一般的,它的确是好代码的一个特点.(好,请有点儿耐心,我们将会马上谈到什么是类)

String的另一个迭代器是 each_line.

ruby> "a\nb\nc\n".each_line{|l| print l}
a

c
   nil 


采用迭代器,这将很轻松的取代C的大多数编程效果(找换行符,生成子串等等)

前面出现的for语句通过each迭代器实现迭代功能. String的each和each_line的工作原理差不多,让我们用for重写上面的例子:

ruby> for l in "a\nb\nc\n"
    |   print l 
    | end
a

c
   nil 


我们可以用retry流程控制语句连接迭代循环,它会从头执行当前循环的迭代.

ruby> c=0
   0
ruby> for i in 0..4
    |   print i
    |   if i == 2 and c == 0
    |     c = 1
    |     print "\n"
    |     retry
    |   end
    | end; print "\n"
012
01234
   nil 


yield有时会在一个迭代器的定义中出现. yield将流程控制移至传递给迭代器的代码域(这将会在过程对象那一节介绍更多的细节).下面的例子定义了一个repeat迭代器,会依参数的设置执行多次代码域.

ruby> def repeat(num)
    |   while num > 0
    |     yield
    |     num -= 1
    |   end
    | end
   nil
ruby> repeat(3) { print "foo\n" }
foo
foo
foo
   nil 


利用retry,我们可以定义一个有while相同作用的迭代器,虽然在实际应用中它太慢了.

ruby> def WHILE(cond)
    |   return if not cond
    |   yield
    |   retry
    | end
   nil
ruby> i=0; WHILE(i<3) { print i; i+=1 }
012   nil 


搞懂什么是迭代器了吗?有一些限制,但你可以写自己的迭代器;实际上,当你定义一个新的数据类型时,为它定义一个合适的迭代器经常也很方便.这样看来,上面的例子并不是很好用.在我们理解了类以后,我们可以讨论讨论更具实际意义的迭代器. </div>

您可能想查找下面的文章:

  • ruby 迭代器使用方法

相关文章

  • Ruby实现的删除已经合并的git分支脚本分享
  • ruby 标准类型总结
  • Ruby中gem包管理器的用法及用bundler来管理多版本的gem
  • 实例讲解Ruby使用设计模式中的装饰器模式的方法
  • ruby实现github第三方认证
  • 关于Ruby on Rails路由配置的一些建议
  • Ruby的字符串与数组求最大值的相关问题讨论
  • Ruby简洁学习笔记(二):类继承、属性、类变量
  • ruby+nokogori抓取糗事百科前10页并存储进数据库示例
  • Ruby中类变量和实例变量的比较

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • 浅析Ruby中的正则表达式的使用
    • web 应用中常用的各种 cache详解
    • ruby 去掉文件里重复的行
    • ruby 局部变量
    • 浅析Ruby中的类对象的概念
    • ruby实现github第三方认证
    • Ruby中的block代码块学习教程
    • 实例解析Ruby程序中调用REXML来解析XML格式数据的用法
    • Ruby中XML格式数据处理库REXML的使用方法指南
    • Ruby on Rails在Ping ++ 平台实现支付

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有