# 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