D瓜哥最近想做一个网站,另外,老早就有学习一门动态语言的想法,满足着两个条件的编程语言中,Ruby、Python是最合适的两种语言。现在Ruby on Rails如日中天,光芒万丈!所以,就选定了Ruby,从零开始学习。

  前天看了Ruby的迭代器,对于我这个只学过Java、C/C++等的人来说,绝对是眼前一亮的感觉!而且是光彩夺目:没想到迭代器还可以这么玩,太简练太方便而且特别强大!然后,D瓜哥就迫不及待的想写一篇文章给大家介绍介绍Ruby的迭代器!

1. 迭代器简介

  先简单介绍一下迭代器。

  1. 一个Ruby迭代器就是一个简单的能接收代码块的方法(比如each这个方法就是一个迭代器)。特征:如果一个方法里包含了yield调用,那这个方法肯定是迭代器;
  2. 迭代器方法和块之间有如下传递关系:块被当成一个特殊参数传给迭代器方法,而迭代器方法内部在使用yield调用代码块时可将参数值传入块;
  3. 实际上,迭代器的功能就是一种回调!迭代器方法所属的类只负责遍历需要遍历的元素,而对元素所做的处理则通过回调代码块来实现;
  4. Ruby中的容器对象(如数组、Range和Hash对象等)都包含了两个简单的迭代器,分别是each和collect。each可以认为是最简单的迭代器,它会对集合的每个元素调用块。 collect,将容器中的元素传递给一个块,在块中处理后返回一个包含处理结果的新数组;

2. 迭代器详解

  Ruby中的迭代器可以说五花八门,下面我们从字符串、数字、数组、Map、文件、目录等几个方面来简单介绍一下Ruby的迭代器。

3. 字符串迭代器

  在Java中,字符串类型的数据没有迭代器。所以,如果需要“遍历”字符串,需要将字符串做一些其他处理才行。但是,在Ruby中就有。下面,我们通过代码来演示一下:

str = "abc"
str.each_byte {|c| printf ">%c", c} #输出: >a>b>c
 

  each_byte 是字串中用于处理每个字节的迭代器。每个字节都会代入块参数 c 中。

  Ruby中,不仅有用于字节的迭代器,还有用于每行的迭代器。示例如下:

str = "abc\nefg\nhijk"
str.each_line{|l| print l} #输出: abc 换行 efg 换行 hijk
 

  怎么样,是不是被Ruby简练但强大的迭代器所折服?!好戏还在后面,接着向下看。

4. 数字迭代器

  在Ruby中,“一切皆为对象”,甚至数字也是对象。这点和Java不一样。所以,对字的迭代器,对于我这个Java程序猿也是闻所未闻。让我们写两个示例,管窥一二。

  第一个场景:对某段代码进行N(比如5)次操作。在Java中,需要写个循环,但是在Ruby中,只需要调用一下times方法即可。代码如下:

5.times {print "I love ruby"}
 

  第二个场景:求1到5的数字之和。这个也特别简单:

sum = 0
(1..5).each {|i| sum += i}
print "sum = " + sum.to_s sum = 0
1.upto(5) {|x| sum += x}
print "sum = " + sum.to_s
 

  有时,我们的步进不一定是1,可能是2,例如奇数和。这种情况下,可以使用step函数。代码如下:

sum = 0
1.step(5, 2) do |y|
sum += y
end
print "Sum = " + sum.to_s

  感觉有点扯远了。下面,我们讲讲数组相关的迭代器。

5. 数组迭代器

  见识过了数字相关的迭代器,我们再看看数组相关的迭代器。

  第一个场景:便利数组并输出每个元素。直接上代码:

lan = ['Ruby', 'Javascript', 'Java']
lan.each_with_index do |lan, i|
p "#{i}, I love #{lan}!"
end
 

  有时,我们需要对数组的元素做出一个挑选,这时可以这样干:

b = [1, 2, 3].find_all{ |x| x % 2 == 1}
 

  有时,我们需要删除数组中的某些值。这时:

a = [51, 101, 256]
a.delete_if {|x| x > 100}

  再来一个例子:

longest = ["cat", "sheep", "bear"].inject do |memo, word|
(memo.length > word.length) ? memo : word
end
print longest
 

6. Map迭代器

  在Java中,如果相对Map使用迭代器,必须把Map转化成List类型的容器才行。但是,在Ruby中,有直接针对Map的迭代器,很好很方便:

sum = 0
cutcome = {"block1" => 1000, "book2" => 1000, "book3" => 4000}
cutcome.each{|item, price| sum += price}
print "sum = " + sum.to_s

  甚至,我们还可以这样:

sum = 0
cutcome = {"block1" => 1000, "book2" => 1000, "book3" => 4000}
cutcome.each{|pair| sum += pair[1]}
print "sum = " + sum.to_s
 

  这里说明一下:上述程序使用了pair[1]读取Map的值,如果要读取Map的键时则写成pair[0]。

  如果需要计算Map的值的加和,可以这样:

sum = 0
cutcome = {"block1" => 1000, "book2" => 1000, "book3" => 4000}
cutcome.each_key do |key|
print key      #输入map的key
sum += cutcome[key]
end
print "sum = " + sum.to_s
 

7. 文件迭代器

  实在是没有想到,对于文件,Ruby也有迭代器可用。如下:

f = File.open("sample.txt")
f.each{|line| print line }
f.close
 

  其实,我们可以使用代码块来进行同样的操作:

File.open("str.rb", "r") do |file|
file.each{|line| print line}
end
 

  使用代码块,不需要手动close。这个推荐!

8. 目录迭代器

  很多时候,我们需要列出某个目录下的文件列表,设置对每个文件进行操作,这时也需要迭代器。Ruby也考虑到了:

Dir.foreach("c://") do |file|
print file
end
 

结尾

  通过上面的介绍可以看出,Java和Ruby相比,在迭代器方面简直是弱爆了!当然,D瓜哥刚刚开始学习Ruby,文中有不当甚至解释错误的地方,劳烦指出,D瓜哥会尽快改正的。

参考资料

  1. Ruby程式語言入門
  2. 【学习笔记】RUBY 块和迭代器
  3. Ruby 使用手冊:迭代器 Iterators
  4. ruby迭代器基础
作 者:D瓜哥,http://www.diguage.com/
原文链接:http://www.diguage.com/archives/86.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。

【转】牛逼闪闪的Ruby迭代器的更多相关文章

  1. [深入react] 4.牛逼闪闪的虚拟DOM

    React.createElement嵌套后的结果就是虚拟dom,虚拟dom听着很高端,其实就是一个json,类似: { type:'div', props:{ className:"box ...

  2. Unreal Enginer4特性介绍-牛B闪闪的UE4

    声明:转载说明出处! unreal4特性介 原文地址:   https://www.unrealengine.com/products/unreal-engine-4     unreal engin ...

  3. 为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?

    为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技 ...

  4. 我喜欢ASP.NET的MVC因为它牛逼的9大理由(转载)

    我很早就关注ASP.NET的mvc的,因为最开始是学了Java的MVC,由于工作的原因一直在做.Net开发,最近的几个新项目我采用了MVC做了,我个一直都非常喜欢.Net的MVC.我们为什么使用MVC ...

  5. 最牛逼android上的图表库MpChart(三) 条形图

    最牛逼android上的图表库MpChart三 条形图 BarChart条形图介绍 BarChart条形图实例 BarChart效果 最牛逼android上的图表库MpChart(三) 条形图 最近工 ...

  6. 最牛逼android上的图表库MpChart(二) 折线图

    最牛逼android上的图表库MpChart二 折线图 MpChart折线图介绍 MpChart折线图实例 MpChart效果 最牛逼android上的图表库MpChart(二) 折线图 最近工作中, ...

  7. 最牛逼android上的图表库MpChart(一) 介绍篇

    最牛逼android上的图表库MpChart一 介绍篇 MpChart优点 MpChart是什么 MpChart支持哪些图表 MpChart效果如何 最牛逼android上的图表库MpChart(一) ...

  8. .Net免费公开课视频+资料+源码+经典牛逼 汇总篇【持续更新】

    博主推荐一:WP8.1最经典培训教程 博主点评:经典Windows Phone8.1 Runtime API培训最经典教程,此教程由传智播客蒋坤老师录制的一整套WP8.1入门级视频教程,讲授内容非常广 ...

  9. 科学家有了钱以后,真是挺吓人的——D.E.Shaw的牛逼人生

    科学家有了钱以后,真是挺吓人的——D.E.Shaw的牛逼人生 黑科技,还是要提D.E.Shaw Research这个奇异的存在. 要讲这个黑科技,我们可能要扯远一点,先讲讲D.E. Shaw这个人是怎 ...

随机推荐

  1. GitHub使用教程及常见错误解决

    1.下载Git并安装 Git for Windows Git-1.8.4-preview20130916.exe 按照默认步骤完成安装 2.设置SSH建立计算机与Github的链接 2.1 点击 开始 ...

  2. ASP.NET 使用application和session对象写的简单聊天室程序

    ASP.Net中有两个重要的对象,一个是application对象,一个是session对象. Application:记录应用程序参数的对象,该对象用于共享应用程序级信息. Session:记录浏览 ...

  3. 精品手游《里奥的财富》高清版逆向移植家用机与PC平台(转)

    冒险动作游戏<里奥的财富>于去年10月登陆移动平台,曾荣获App Store“年度优秀游戏”.开发商宣布将推出其HD版本,近期会陆续登陆PS4.PC.MAC.Xbox One平台. 由瑞典 ...

  4. ansible网络模块安装httplib2

    ansible网络模块安装httplib2 在进行使用ansible的网络模块的时候,需要安装httplib2模块 下载地址: https://pypi.python.org/pypi?%3Aacti ...

  5. UI控件入门

    其实整个学习过程.确实有点儿混乱,因为不懂的东西太多,一会儿看这,一会儿看那,马上就乱了. 还是先做点儿简单的事儿,说控件,但不会说完全,只是入个门,知道怎么学控件,具体要学好每一个控件需要项目中磨练 ...

  6. sql server 2008 r2 出问题

    1.想利用sql2008的数据挖掘功能,以为是没有安装全,所以就卸载了. (1)利用Windows Installer Clean UP将以前的卸载干净 (2)出现了Could not open ke ...

  7. how to install flash

    Choice 1: Install  Flash from Repository: This is fairly simple and easy and should work from most p ...

  8. 老 base64 for xe8

    not recommend ,only for study procedure TForm1.Button3Click(Sender: TObject); var ssi, sso: TStringS ...

  9. HD1046An Easy Task

    Problem Description Ignatius was born in a leap year, so he want to know when he could hold his birt ...

  10. Bash's ArithmeticExpression

    [Bash's ArithmeticExpression] let command: let a=17+23 echo "a = $a" # Prints a = 40 let a ...