Ruby 中的Enumerable 和 Comparable 模块

2017-11-17 10:55:17来源:oschina作者:穿山人点击

分享
# 1 Enumerable 和 Comparable 是模块
# 2 Ruby中的集合类型基本都mixin了这两个模块
# 3 枚举模块中的lazy 处理大量数据的时候可以考虑使用lazy
# 4 符号方法 > 符号是 模块 Comparable中的
p 3 > 2
p 3.>(2)
p Comparable.instance_methods
# 5 String之类的可以比较就是因为mixin了 Comparable模块
# 6 自定义类导入Comparable 模块和 定义 <=> 方法
class Person
attr_reader :name
include Comparable # mixin Comparable模块
def initialize(name)
@name = name
end
# 定义<=> 通过name属性来比较 因为name属性是String类型的
# 所以通过String的比较来比较Person
# 这样相当于告诉Comparable 我们如何比较 我们比较的规则是什么 然后Comparable会给我们一些其他的功能
def <=> other
self.name <=> other.name
end
end
p1 = Person.new('Andy')
p2 = Person.new('May')
p3 = Person.new('Young')
p p1 < p2 #true
p p1 > p3 #false
# p p2.between?(p1, p3) #true
# p p1.between?(p2, p3) #false
# 自定义类 mixin Enumerable
# 同理不单单需要include Enumerable 还要定义each方法
# 因为each 方法是Enumerable的基石 其他方法很多都是建立在each功能上完成的
class People
attr_reader :people
include Enumerable
def initialize(people) # 传入Person的数据
@people = people
end
# each方法是关键有了each方法 Enumerable里面的方法才能以each方法为根据
# 使用enumerable的其他方法
def each
raise 'pls provide a block!' unless block_given?
# 此处的people是实例变量 是self.people的省略写法 再加上有attr_reader :peopl 不然不能调用people
people.each do |person| # 此处因为是自定义的类所以知道people是Array 所以可以使用each方法
yield person
# puts person.name
# p person if person.name == 'Young'
# 也可以调用的时候不写代码块 直接在方法里面写你要的代码
# 但是这样就不Ruby了 Ruby使用代码块就是为了提高代码的复用性和灵活性
end
end
end
people = People.new([p1, p2, p3])
people.each do |n|
puts n.name
end
# people.detect do |n|
# p n if n.name == 'Young'
# end
people.detect do |n|
n.name == 'Young'
end
# people.each
# Enumerable

相关文章

    无相关信息

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台