ruby的Comparable 和Enumerable

Comparable module

include Comparable 一般来说是用于比较的,需要重写 <<=>>方法

如下:

class Person 
 include Comparable 
 attr :age  
 def <=>(aPerson) 
 @age <=> aPerson.age 
 end  


 def initialize(name, gender, age)   
  @name = name   
  @gender = gender 
  @age = age  
 end 
end

aPerson = Person.new("Tom", "male", 18) 

bPerson = Person.new("Mike", "male", 10) 

cPerson = Person.new("Henry", "male", 40)

 puts aPerson > bPerson

 puts aPerson < bPerson 
puts aPerson >= bPerson 
puts aPerson <= bPerson puts aPerson == bPerson 
puts aPerson.between?(bPerson, cPerson)


Enumerable mixin提供了遍历,查找和排序的功能。 要使用Enumerable mixin必须提供each方法,标准做法是在each方法内对每一个元素使用yield操作。如果使用了Enumerable mixin中的max,min,或sort,那么还必须提供<=>方法,用来实现元素之间的比较关系

以下是一个使用Enumerable mixin的例子,IntegerFinder是一个查找字符串中整数的类。 
class IntegerFinder  include Enumerable 
  def initialize(aString)   @string = aString  end   
def each   
@string.scan(/[1-9]\d*/) { |integer| yield integer } 
 end 
end 
  
aDigitFinder = IntegerFinder.new("This is 123, 234, 98 and 10") 
aDigitFinder.collect {|i| print i, " "}

aArray = aDigitFinder.find_all {|i|  i.to_i > 50 } puts "\n", aArray.to_s  
执行结果为: 
123 234 98 10  12323498 
Enumerable mixin中含有许多与集合遍历查找相关的方法,许多标准类也使用了

Enumerable mixin,借助Enumerable mixin中的方法可以方便的实现一些强大的功能,请看以下一些例子: 
#察看数组中的所有单词的长度是否大于4 
%w{ ant bear cat}.all? {|word| word.length >= 4}   #=> false    #返回range中所有不符合条件的元素 
(1..10).reject {|i|  i % 3 == 0 } #=> [1, 2, 4, 5, 7, 8, 10] 
 
#求5到10的和 
#inject方法第一次会把Range中的前两个元素作为参数传递给sum和n, #以后每次会把sum设置为块计算后的返回值。 
(5..10).inject {|sum, n| sum + n }               #=> 45 
 
# 找出数组中最长的单词 
longest = %w{ cat sheep bear }.inject do |memo,word|     
memo.length > word.length ? memo : word 
end 
longest          #=> "sheep"


















 74 
puts aPerson >= bPerson 
puts aPerson <= bPerson puts aPerson == bPerson 
puts aPerson.between?(bPerson, cPerson)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值