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)