首页 > 代码库 > ruby之Enumerable

ruby之Enumerable

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"]

ruby之Enumerable