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 ...
随机推荐
- 如何使用Django实现用户登录验证
最初开始搞用户登录验证的时候感觉没什么难的,不就是增删改查中的查询数据库么,但是还是遇到许多小问题,而且感觉在查询数据库的时候,要把前端的数据一条一条的进行比对,会导致我的代码很丑,而且方式很不智,所 ...
- Bootstrap 轮播图(Carousel)插件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- IDEA运行后控制台输出乱码
1.点击 2.点击 3.添加:-Dfile.encoding=UTF-8 . 4.点击OK
- Java并发之LinkedBlockingQueue
上一篇我们已经学习过了 ArrayBlockingQueue的知识及相关方法的使用,这一篇我们就来再学习一下ArrayBlockingQueue的亲戚 LinkedBlockingQueue.在集合类 ...
- 用cocos2d-html5做的消除类游戏《英雄爱消除》(2)——Block设计实现
Block可以说是这个游戏的核心类,它除了包含自身的一些属性和方法外还添加了对触摸事件的响应. 我们先来看下源码吧 /** * Power by html5中文网(html5china.com) * ...
- jquery 如何获取单选框的值
jquery 如何获取单选框的值 获取单选框的值有三种方式: 1.$('input:radio:checked').val():2.$("input[type='radio']:chec ...
- flex TweenLite
本贴已在 AS天地会转发,大家可以参考:http://bbs.actionscript3.cn/viewthread.php?tid=11090&pid=91142&page=1&am ...
- AC自动机的一点理解
\(fail\)指针:指向最长的在\(tire\)里出现的后缀 比\(tire\)多出来的子边:原来的\(tire\),我们失配后又得返回根结点再次匹配,而加入这些边后只需要花\(strlen(s)\ ...
- 如何彻底禁止手机连接usb,代码实…【转】
本文转载自:https://blog.csdn.net/jun4331247/article/details/51201825 作为系统第三次被黑的修复方法,捯饬了半天,没效果,最后大神一出手,果然出 ...
- codeforces 466C 计数 codeforces 483B 二分 容斥
题意:给你n个数,将他们分成连续的三个部分使得每个部分的和相同,求出分法的种数. 思路:用一个数组a[i]记下从第一个点到当前i点的总和.最后一个点是总和为sum的点,只需求出总和为1/3sum的点和 ...