# 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