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 ...
随机推荐
- PAT 1051. 复数乘法 (15)
复数可以写成(A + Bi)的常规形式,其中A是实部,B是虚部,i是虚数单位,满足i2 = -1:也可以写成极坐标下的指数形式(R*e(Pi)),其中R是复数模,P是辐角,i是虚数单位,其等价于三角形 ...
- Android底部菜单栏+顶部菜单
底部菜单栏+顶部菜单(wechat)demo http://blog.csdn.net/evankaka/article/details/44121457 底部菜单demo http://blog.c ...
- zabbix监控入门初步
1.Zabbix是什么? Zabbix是一个基于Web界面的分布式系统监控的企业级开源软件.可以监视各种系统与设备的参数,保障服务器及设备的安全运营. 2.Zabbix的功能和特性 (1)安装与配置简 ...
- ARDUINO W5100 WebClient 测试
基础工作:W5100扩展板插在ARDUINO上.用网线把W5100和自己家的路由器连接.插上网线能看到侧面网口指示灯变亮.路由器开启DHCP服务(一般都是开启的). 1.打开官方例程里面的Ethern ...
- nuget.org 无法加载源 https://api.nuget.org/v3/index.json 的服务索引 不定时抽风
今天添加新项目想添加几个工具包,打开NuGet就这样了 发生错误如下: [nuget.org] 无法加载源 https://api.nuget.org/v3/index.json 的服务索引.响应状 ...
- tomcat7 中的坑。 关于welcome-list和servlet-mapping
web.xml中, 使用default servlet设置了针对静态资源后缀名的过滤. 并且设置了welcome-list, 使用jetty和tomcat6启动一切正常, 但是使用tomcat7则出现 ...
- POJ 1639 Picnic Planning:最小度限制生成树
题目链接:http://poj.org/problem?id=1639 题意: 给你一个无向图,n个节点,m条边,每条边有边权. 让你求一棵最小生成树,同时保证1号节点的度数<=k. 题解: 最 ...
- BZOJ 3943 [Usaco2015 Feb]SuperBull:最大生成树
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3943 题意: 有n只队伍,每个队伍有一个编号a[i]. 每场比赛有两支队伍参加,然后选一支 ...
- Javascript-- jQuery 核心
jQuery中each方法的应用 jQuery中有个很重要的核心方法each,大部分jQuery方法在内部都会调用each,其主要的原因的就是jQuery的实例是一个元素合集 如下:找到所有的div, ...
- linux命令学习笔记(55):traceroute命令
通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径.当然每次数据包 由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不 ...