简单的讲,一个迭代器就是一个能接受代码块的方法。当初为了进行迭代操作而设置了带块方法,现在很多时候仍然称它为迭带器。

可实际上,早期版本的 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

最新文章

  1. Android 自定义view(二) &mdash;&mdash; attr 使用
  2. php页面静态化
  3. paper 24 :matlab的cat函数
  4. HDU 3507 Print Article 斜率优化
  5. UVA11401Triangle Counting(简单计数)
  6. 王立平--PopupWindow
  7. 【Demo 0003】Android 事件
  8. C#调用winhttp组件 POST登录迅雷
  9. APK的反编译
  10. Linux 服务器 U盘安装(避免U盘启动)
  11. LAMP_yum安装
  12. 前端面试知识点集锦(JavaScript篇)
  13. spark提交jar包时出现unsupported major.minor version 52.0错误的解决方案
  14. 【做题】arc068_f-Solitaire——糊结论
  15. ETL设计详解
  16. css中padding与margin
  17. (一)ElasticSearch-入门
  18. 获得通讯录并拨打电话 Android
  19. tomcat work目录
  20. 07_Warning $HADOOP_HOME is deprecated.去除办法

热门文章

  1. Jquery禁用所有checkbox
  2. Linux c编程:线程属性
  3. maven编译问题-maven项目运行时找不到文件,解决方案之一
  4. 好用的 curl 抓取 页面的封装函数
  5. c语言操作mysql数据库
  6. C# Lambda表达式与Linq
  7. cookie补充
  8. curl简单封装 get post
  9. hd acm 1465
  10. 如何处理异常? catch Exception OR catch Throwable