Ruby 中的Enumerable 和 Comparable 模塊

# 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
相關文章
相關標籤/搜索