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
相关文章
相关标签/搜索