今天要讲的是迭代器(iterator)。什么是迭代器呢?它的好处就是会一个一个地传回集合里的元素,让我们可以利用迭代方法做重复的事。

在Ruby里的collection集合里有Array数组和Hash哈希。

今天要介绍三种用在collection集合的迭代器分别叫each,map和collect,这也是常见的Ruby面试考题呢!

Ruby经典面试题目#14

Day14 each,map和collect比较?What's the difference between each,map and collect?

我们来使用这三种迭代器,在Array和Hash两种集合中各举几个生活化的例子,相信大家就比较容易暸解啰!

Array

Array#each

最近我在进行旅行存钱计划。我有三个银行帐户,NAB,CAN,和WESTPAC,开户金额分别为100,200,300。所以我写一个数组集合放入初始金额[100,200,300]。

假设我打算开始从本周开始在每个帐户存入50元(+50),可以在数组后加上.each方法:

[100,200,300].each {|n| puts n+50}

结果列出各个帐户的金额(注意:puts写在block大括号里):

150

250

350

经过.each方法作用之后,只会分别印出同一数组中各个元素的值,不会产生新数组。

Array#collect

以上案例,换成.collect试试看:(注意!puts写在前面)

puts [100,200,300].collect {|n| n+50}

.collect会帮我们把结果放入新的数组。结果印出(xujiaqing):

[150,250,350]

Array#map

同样的,.map方法也会帮我们产生新的数组。

puts [100,200,300].map {|n| n+50}

结果印出:

[150,250,350]

那.collect与.map又有什么不同?以及分别用在什么情况呢?这时候就要翻查Ruby手册里,关于.collect和.map的介绍了:

collect { |item| block }→new_ary Invokes the given block once for each element of self.Creates a new array containing the values returned by the block.

hmm…好像看不出有什么差异呢!

map { |obj| block }→array Returns a new array with the results of running block once for every element in enum.

近一步查询stackoverflow,果然有其他网友问过类似的问题。我们可以把.map当作是.collect的别名(map is an alias for collect),实务上比较常使用.map喔!

更多Array#map用法

现在把我的银行帐户数组存进account变数里,再用.inspect检查数组的值:

account = [100,200,300]

account.map {|n| n+50}

p account.inspect

结果印出

“[100,200,300]”

如果在.map后加上惊叹号.map!呢?

account.map!{|n| n+50}

p account.inspect

存进去原本的数组了。钱钱变多了!开心~~(加上!惊叹号的方法,通常代表小心!注意!的意思)

在这里的.map方法会让原本的物件数组被改变呢!

“[150,250,350]”

Hash

Hash哈希是一对key与value的集合。在刚刚的银行帐户例子里,我们可以把银行名称当作索引,存款数目当作值:

account = {“NAB”=> 100,“CAN”=> 200,“WEST”=> 300}

利用哈希来展现目前的信息(帐户名称、存款金额),这样就可读性更加清楚了。

Hash#each

现在我想要计算三个帐户加总共有多少钱,以.each的方式可写为:

mymoney = 0

account.each {|bankname,saving| mymoney += saving} #把索引和值列出

print“My Money: $”+ mymoney.to_s

或是

mymoney = 0 #设定初始值

account.each{|bank| mymoney += bank[1]} #依序加总bank集合里第二个元素bank[1]

print“My Money: $”+ mymoney.to_s

结果都会印出:

My Money: $ 600

Hash#map

在Hash里,把.each换成.map或是.collect:

mymoney = 0 #设定初始值

account.collect{|bank| mymoney += bank[1]} #依序加总bank集合里第二个元素bank[1]

print“My Money: $”+ mymoney.to_s

结果都是一样的:

My Money: $ 600

Hash#map结合Array#each与Array#map

现在要进阶到一个较为复杂的例子:hash里包含索引和值两部份,那我们可不可以把数组当作一种值,放在里面呢?

当然可以!

假设我的NAB银行下有2个子帐户,CAN银行下有3个子帐户,分别放入这些资产:

hash = {“NAB”=> [“Cash”,“Gold”],“CAN”=> [“Bitcoin”,“Litecoin”,“Ethereum”] }

利用hash.map会产生一个新的数组:(进一步了解说明,看stackoverflow的说明)

p hash.map {|n| n}

结果显示:

[[“NAB”,[“Cash”,“Gold”]],[“CAN”,[“Bitcoin”,“Litecoin”,“Ethereum”]]] #我有好多帐户!NAB下有2个,CAN下有3个

我想分别提取出银行:帐户名称的这一对信息,并且用逗号.join(“,”)隔开。

为了程序可读性,hash的索引命名为bank(银行名),值为account_arry(放了不同数目的子帐户数组)。在走account_arry.each展开数组迭代器时,每在集合里走完一个元素,就印出#{bank}:#{sub_account}

p hash.map {

|bank,account_arry| account_arry.each{

|sub_account|“#{bank}:#{sub_account}”}

}.join(“,”)

结果仅印出:

“Cash,Gold,Bitcoin,Litecoin,Ethereum”

奇怪,这不是我要的结果呀!我很希望帐户前面能显示出银行名称呢!

这是因为刚刚说过,arry.each会回传数组本身,在这个例子里,分别回传的是[“Cash”,“Gold”]和[“Bitcoin”,“Litecoin”,“Ethereum”]

改成.map试试看:

p hash.map {

|bank,account_arry| account_arry.map{

|sub_account|“#{bank}:#{sub_account}”}

}.join(“,”)

结果显示为:

“NAB: Cash,NAB: Gold,CAN: Bitcoin,CAN: Litecoin,CAN: Ethereum”

这是因为account_arry.map自动帮我们产生新的数组,放进bank与对应的sub_account并回传。

最后放个小小的比一比表格作为总结(expatvision):

each map / collect

Array方法Enumerable(列举)方法

回传Array本身产生新的Array并回传

祝福大家能顺利collect不同的资产,不管是有形的财富、还是无形的知识,最后都可以达成钱多多的心愿喔!:D

转载于:https://www.cnblogs.com/lannyQ-Q/p/11561470.html

Day14 - Ruby比一比:#each #map和#collect method相关推荐

  1. pringMVC“Ambiguous mapping found. Cannot map ‘XXXController‘ bean method”解决方法

    pringMVC"Ambiguous mapping found. Cannot map 'XXXController' bean method"解决方法 参考文章: (1)pri ...

  2. Ambiguous mapping found. Cannot map 'xxxxController' bean method

    1.背景 今天要做一个demo,从github上clone一个springmvc mybatis的工程(https://github.com/komamitsu/Spring-MVC-sample-u ...

  3. pringMVC“Ambiguous mapping found. Cannot map 'XXXController' bean method”解决方法

    [转 :http://www.fanfanyu.cn/news/staticpagefile/2351.html] 最近在开发项目的过程中SpringMVC抛了个"Ambiguous map ...

  4. select ...as_一起使用.select .map和.reduce方法可充分利用Ruby

    select ...as by Declan Meehan 由Declan Meehan 一起使用.select .map和.reduce方法可充分利用Ruby (Get the most out o ...

  5. scala 偏函数与 map/collect

    https://fangjian0423.github.io/2015/06/14/scala-partial/ https://www.jianshu.com/p/fa2ed7ed391e 0. c ...

  6. Ruby 札记 - Ruby 集合家族之数组(Array)

    学习 Ruby 集合我觉得最好的方式是打开 irb --simple-prompt 命令,跟着例子学习.试着借助 Tab 补全加以思考?. 创建数组 和其他动态语言创建相似. >> a = ...

  7. Java8 Stream应用:Map合并、过滤、遍历、values int求和等

    1. Java多个Map合并 // 多个Map<Long,Integer>, 根据key相同的,value累积求和: public static Map mapCombine(List&l ...

  8. Java bean转换map

    /** * * @Title: convertMap * @Description: 使用泛型Map转bean * 首先先把传入的实体bean的类型通过反射实例化,获取该bean的所有方法. * 遍历 ...

  9. flatmap 与map 的区别 java_map和flatmap的区别+理解、学习与使用 Java 中的 Optional

    orElse() 和 orElseGet()的不同之处 乍一看,这两种方法似乎起着同样的作用.然而事实并非如此.我们创建一些示例来突出二者行为上的异同. 我们先来看看对象为空时他们的行为: @Test ...

  10. modelMapper.map的一个使用例子

    先上modelMapper.map的中文翻译:(百度自动翻译) 应用通常由相似但不同的对象模型组成,其中两个模型中的数据可能相似,但模型的结构和关注点不同.对象映射使将一个模型转换为另一个模型变得容易 ...

最新文章

  1. 中科院 工程硕士专业课 复试考试前的辅导安排
  2. SBB:不同植被土壤中细菌古菌的群落分布模式比较
  3. oracle rownum分页 出现重复数据
  4. JQUERY获取text,areatext,radio,checkbox,select值
  5. 数学问题当中的一些基本计数问题
  6. 【攻防世界010】re1-100
  7. 【转】体验 Silverlight 5 3D开发之环境搭配篇
  8. 开源GIS(十三)——openlayers通过geoserver中WFS添加要素
  9. 关于窗口跳转的一些总结
  10. Linux操作系统中sed工具常见用法
  11. ie6对postion:fixed的完美解决方案
  12. C#使用PDF控件打开PDF
  13. c语言实现维吉尼亚密码和希尔密码的加解密
  14. 太赞了!靠着这份面试题跟答案
  15. FPGA的计数器设计
  16. Nginx的重启命令(nginx -s reopen)
  17. 计算机启动后只有鼠标桌面黑屏,电脑开机黑屏只有鼠标的解决方法
  18. 爬山搜索法c语言代码,搜索算法--爬山法 (代码示例)
  19. 微信小程序自动生成打卡海报
  20. windows DoraOS 双系统云终端安装

热门文章

  1. MGRE、OSPF综合实验
  2. SSM框架面试题及答案整理
  3. Spring Boot教程(二十五)关于RabbitMQ服务器整合
  4. 将字符串中连续的多个空格替换成一个空格
  5. 极限运动:街头极限单车,不只是牛逼!
  6. uvalive3983Robtruck
  7. RHEL5 Linux下Oracle 10 Client的安装明细
  8. 不可能解开的谜题   (程序员修炼之道,评注者序)
  9. 11款实用的一句话网站设计代码
  10. free C# Ebook (Amazing amount of ebooks available)