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. the server responded with a status of 404 (Not Found)

    1.出现这种问题,第一时间检查文件路径是否正确,相对路径或者绝对路径是否正确 2.某些后缀的文件是否能够找到,我现在碰到的就是.md文件找不到,需要配置web.config <system.we ...

  2. Intellij IDEA开发第一个Android应用

    1.创建一个项目 File——>New Project——>.......——>Finish 2.创建模块 3.MyActivity.java package com.example ...

  3. 2014搜狗前端面经【A事业部】

    刚刚面完搜狗,有种莫名其妙的感觉,哪里莫名其妙呢?听我慢慢道来... 开始面试官就这简历,问了一些有的没的东西,都不深(好吧我承认之前的经历有点菜,没神马加分项啊). 后面开始技术面: 知识点1:JS ...

  4. Sublime Text 3快捷键

    Ctrl+Shift+P:打开命令面板 Ctrl+P:搜索项目中的文件 Ctrl+G:跳转到第几行 Ctrl+W:关闭当前打开文件 Ctrl+Shift+W:关闭所有打开文件 Ctrl+Shift+V ...

  5. 学习内容:Html5+Axure原型设计

    今日主要在http://www.runoob.com/html/html5-intro.html和http://www.imooc.com/learn/9网站上学习Html的知识,head.title ...

  6. android参考

    android:使用BaseExpandableListAdapter实现可折叠的列表 Android-ListView实现SectionIndexer SectionIndexer 的使用(联系人分 ...

  7. PHP强大的内置filter (二) 完

    <?php #Sanitize filters #Sanitize filters 可以清理掉不规范的字符 # FILTER_SANITIZE_EMAIL 可以清理除了 字母和数字 以及 !#$ ...

  8. 【整理】JavaEE基本框架(Struts2+Spring+MyBatis三层,Struts MVC)之间的关系

    #[整理]JavaEE基本框架(Struts2+Spring+MyBatis三层,Struts MVC)之间的关系 ![关系图解](http://images.cnitblog.com/blog/84 ...

  9. Flex之DataGrid和Tree控件的数据源XML格式

    1.flex的完整代码: <?xml version="1.0" encoding="utf-8"?> <s:Application xmln ...

  10. WPF 简介

    简介 一.   WPF产生的背景 因为人们的生活水平不断提前,审美观也随着提升,而软件的应用发展水平目前无法赶上大家的审美观和使用要求:比如:像电影中的软件能够方便的使用,而且有动态的效果同时附加形象 ...