Ruby迭代器(Iterator)
简单的讲,一个迭代器就是一个能接受代码块的方法。当初为了进行迭代操作而设置了带块方法,现在很多时候仍然称它为迭带器。
可实际上,早期版本的 Ruby 将使用代码块的方法称为迭代器,因为它们就是被设计来实现循环迭代的。但是在Ruby发展过程中,代码块的用途在后来已经得到了很大的增强,从最初的循环抽象到任何事情,那些进行迭代操作的方法仍然可以叫做迭代器,但要将所有带块方法的调用过程都看作迭带器的话,并不太合适而且概念上也容易引起混乱。
现对Ruby中基础的迭代器做简单的介绍:
1、each方法
最简单的迭代器,连续访问集合的所有元素,依次赋给与each方法相关联的block的变量。由于 Ruby 内建的循环原语只有 while 和until,for只是一个语法块,所以经常使用each方法来取代for循环的功能。例:
[1,3,5].each {|i| puts i }
# 本例中,对象[1,3,5]调用each方法,each方法将该对象每个值依次赋给block中的i变量。
输出结果
1
3
5
2、map和collect方法相同
从集合中获得各个元素传递给block,block返回的结果生成新的集合。这个迭代器遍历集合中的每一个元素,然后传递给block块进行运算,最后将block块的返回值加入一个新创建的集合,这个新集合会在迭代完成后返回,并且又不影响原有的集合。
# 代码块的返回值可以被调用者使用。
["H", "A", "L"].collect {|x| x.succ} 输出结果:
["I", "B", "M"]
3、inject方法
遍历集合中的各个元素,将各个元素累积结果作为返回值,多用于求得集合元素的和或积。该方法后面的block中包含两个块变量。例如:
# 把0赋给num,数组里面的元素赋给element
[2,4,6,8].inject(3) { |sum,element| sum + element } #带参数
输出结果:23
[2,4,6,8].inject { |product,element| product * element } # 不带参数
输出结果:384 # Array的一部分可以调用inject方法
a = [2,4,6,8,10]
a[0,2].inject(3) { |sum,element| sum + element }
输出结果:9
# range可以调用inject方法
(2..5).inject(3) { |sum,element| sum + element }
输出结果:17
工作原理:
(1)当inject有参数时,inject后面的block第一次执行时,sum或product的值被设置为参数的值,而element的值被设置为集合中第一个元素的值。接下来每次再执行block时,sum或product的值被设置为上次调用block时的返回值,element即为集合中下一个元素的值。inject的最终结果是最后一次调用block的返回值。
(2)当inject没有参数时,sum或product以集合中第一个元素的值作为初始值,表达式从第二个元素开始迭代。
4、times方法
该方法是整数支持的集中常用的迭代器之一。调用times方法的一般是具体的数字(整数)对象,times会按照对象的要求来指定其后block的执行次数。例如:
5.times{print“*”}
输出结果:
*****
5、upto方法
该方法是整数支持的集中常用的迭代器之一。upto()方法带有一个参数,参数的值与调用它的对象的值构成一个range,然后再将该range内的值依次赋值给其后block中的变量。例如:
1.upto(10)do|i|
factorial += i
end
puts factorial 执行结果为:
55
6、downto方法
该方法是整数支持的集中常用的迭代器之一。downto 方法是 upto 方法的逆方法。downto 方法也带有一个参数,调用它的对象的值与参数值构成一个range,然后再将该range内的值依次赋值给其后block中的变量。例如:
20.downto(15){|i|print i,","}
输出结果:
20,19,18,17,16,15
7、step方法
该方法的形式为:a.step( b, c ) { block },它有两个参数,其中第一个参数 b 与调用该方法的数字对象 a 构成一个range。相当于是一个以 a 为首项,b 为末项,c 为公差的一个等差数列。step 方法的作用就是将该等差数列的各项分别传入 block 中,进行迭代。例如:
10.step(20,2){|i|print i,","}
输出结果:
10,12,14,16,18,20
# 注意,从数学的意义上讲,在setp方法中并不要求b = n*c成立(n为整数),只需要满足a < b成立即可。例如:
12.step(26, 5.1) {|i| print i, ","}
输出结果:
12.0,17.1,22.2
Ruby迭代器(Iterator)的更多相关文章
- ruby迭代器iterator和枚举器Enumerator
编写自定义的迭代器 The defining feature of an iterator method is that it invokes a block of code associatedwi ...
- 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。
最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...
- VC++ 迭代器 iterator, const_iterator, const iterator
迭代器 iterator, const_iterator, const iterator 迭代器iterator的作用类似于指针. (1)iterator只有针对制定<类型>的容器才有效. ...
- 迭代器iterator
现在接着上篇的,写一来标识vector 的元素的对象迭代器iterator: 还是通过具体代码举例: 下面我讲了一个我暑期团队的故事哦~~: #include<iostream> #inc ...
- 【转】牛逼闪闪的Ruby迭代器
D瓜哥最近想做一个网站,另外,老早就有学习一门动态语言的想法,满足着两个条件的编程语言中,Ruby.Python是最合适的两种语言.现在Ruby on Rails如日中天,光芒万丈!所以,就选定了Ru ...
- c++中的迭代器 iterator
迭代器iterator的作用类似于指针. iterator只有针对制定<类型>的容器才有效.例如: vector<int> vec; vector<int>::it ...
- Python的迭代器(iterator)和生成器(constructor)
一.迭代器(iterator) 1.迭代器的概述 在Python中,for循环可以用于Python中的任何类型,包括列表.元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器 迭代器 ...
- 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释
迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...
- Java 实现迭代器(Iterator)模式
类图 /** * 自己定义集合接口, 相似java.util.Collection * 用于数据存储 * @author stone * */ public interface ICollection ...
随机推荐
- Android 主线程和子线程通信问题
Android 如今不支持View在子线程中创建及调用其方法.假设要实现子线程内容更新之后.将结果及时反馈到主线程中,该怎样出来呢? 能够在主线程中创建Handler来实现. 这样子线 ...
- 【thrift】初识thrift
Reference:http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/ http://jacksongblack.blog.51c ...
- ThinkPHP 3.2.2 事务
手册里说得非常清楚 : 5.3.19 事务支持 ThinkPHP提供了单数据库的事务支持,如果要在应用逻辑中使用事务,可以参考下面的方法: 启动事务: PHP代码 $User->startTra ...
- 三维bfs
胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- 吴恩达机器学习笔记(四) —— BP神经网络
主要内容: 一.模型简介 二.一些变量所代表的含义 三.代价函数 四.Forward Propagation 五.Back Propagation 六.算法流程 待解决问题: 视频中通过指出:当特征变 ...
- Can I run a local BLAST search again multiple blast databases simultaneously?
from: https://secure.clcbio.com/helpspot/index.php?pg=kb.page&id=113 Can I run a local BLAST sea ...
- LINQ 学习路程 -- 查询操作 OfType
OfType操作根据集合中的元素是否是给定的类型进行筛选 IList mixedList = new ArrayList(); mixedList.Add(); mixedList.Add(" ...
- linux学习系列二
vim是由vi发展而来,具有语法高亮显示,多视图编辑,代码折叠,支持插件等功能,vim成为了linux发行版本的标配. 1. vim工作模式 1. 普通模式:实现基本的光标移动和大量的快捷操作 2. ...
- 大话设计模式--策略模式 strategy -- C++实现实例
1. 策略模式: 它定义了算法家族, 分别封装起来,使他们之间可以相互替换,此模式让算法变化, 不会影响到使用算法的客户. 用相同的方法调用不同的算法,减少各种算法类与使用算法类之间的耦合. 实例中策 ...
- linux学习-文件打包与压缩