在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
简单的讲,一个迭代器就是一个能接受代码块的方法。当初为了进行迭代操作而设置了带块方法,现在很多时候仍然称它为迭带器。 可实际上,早期版本的 Ruby 将使用代码块的方法称为迭代器,因为它们就是被设计来实现循环迭代的。但是在Ruby发展过程中,代码块的用途在后来已经得到了很大的增强,从最初的循环抽象到任何事情,那些进行迭代操作的方法仍然可以叫做迭代器,但要将所有带块方法的调用过程都看作迭带器的话,并不太合适而且概念上也容易引起混乱。 现对Ruby中基础的迭代器做简单的介绍: 1、each方法 最简单的迭代器,连续访问集合的所有元素,依次赋给与each方法相关联的block的变量。由于 Ruby 内建的循环原语只有 while 和until,for只是一个语法块,所以经常使用each方法来取代for循环的功能。例:
1 [1,3,5].each {|i| puts i } 2 # 本例中,对象[1,3,5]调用each方法,each方法将该对象每个值依次赋给block中的i变量。 3 4 输出结果 5 1 6 3 7 5
2、map和collect方法相同 从集合中获得各个元素传递给block,block返回的结果生成新的集合。这个迭代器遍历集合中的每一个元素,然后传递给block块进行运算,最后将block块的返回值加入一个新创建的集合,这个新集合会在迭代完成后返回,并且又不影响原有的集合。
1 # 代码块的返回值可以被调用者使用。 2 ["H", "A", "L"].collect {|x| x.succ} 3 4 输出结果: 5 ["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
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论