Enumberable可枚举模块可以理解为对遍历搜索和比较排序集合的抽象。这个模块可以通过mixin为类提供两种能力:
1、可以遍历搜索
enum.all?{|object| block} 判断集合中是否所有元素都满足某条件
puts [1,2,3,4].all?{|i| i>0} #true
puts [1,2,3,4].all?{|i| i>3} #false
enum.any?{|object| block} 判断是否至少有一个元素满足条件
<span style="white-space:pre"> </span> puts [1,2,3,4].any?{|i| i>3} #true
enum.collect{|object| block} 每个元素传入block运行的结果以数组形式返回
enum.map为其别名方法
<span style="white-space:pre"> </span>puts [1,2,3,4].collect{|i| i+1 } #[2,3,4,5]
enum.each_with_index{|object,index| block}
与each类似,第一个参数为每个元素,第二个为元素对应的坐标
<span style="white-space:pre"> </span>puts [1,2,3,4].each_with_index{|item,index| puts "#{item}-#{index}"}
#1-0 2-1 3-2 4-3 [1,2,3,4]
注意:执行完后返回集合本身
enum.find(ifnone=nil){|object| block}
找出集合中第一个符合条件的,没有返回ifnone代码块
<span style="white-space:pre"> </span>block=Proc.new(){puts "hello"}
puts [1,2,3,4].find(block){|item| item>5}
#hello
enum.find_all{|i| block} enum.select{|i| block}
返回符合条件的缩影元素
enum.include?(object)集合是否包含
enum.partition{|item| block} 按是否符合条件分割
<span style="white-space:pre"> </span>result=[1,2,3,4].partition(){|item| item>1}
<span style="white-space:pre"> </span>puts result[0] #{2,3,4}
<span style="white-space:pre"> </span>puts "====="
<span style="white-space:pre"> </span>puts result[1]
enum.inject(initial=nil){|memo,obj| block} initial 未指定时memo为enum第一个元素 obj从第二个开始迭代
initial指定后,memo初始为指定值,从第一个元素开始迭代。
memo的值会被设置为block运行的结果
2、可比较和排序
enum.Max enum.Max{|a,b| block}
enum.Min enum.Min{|a,b| block}
enum.sort enum.sort{|a,b| block}
enum.sort_by与enum.sort同,不过更耗费资源。
<span style="white-space:pre"> </span>puts ["a","abc","ab"].sort{|a,b| a.length<=>b.length}
<span style="white-space:pre"> </span>#["a","ab","abc"]