Module, Mixin

モジュールとはメソッド、クラス、定数をグループ化する方法の一つ。モジュールをincludeすることでMixinが実現できる。mixinされたモジュールはスーパークラスとして動作する。

class Person
  include Comparable
  attr_reader :name
  def initialize(name)
    @name = name
   end
   def to_s
     "#{@name}"
   end
   def <=>(other)
     self.name <=> other.name
   end
end

p1 = Person.new("Matz")
p2 = Person.new("Guido")
p3 = Person.new("Larry")

if p1 > p2
  puts "#{p1.name}'s name > #{p2.name}'s name"
end

puts [p1, p2 p3].sort

Rubyのコレクションクラスの機能も自分のクラスにEnumerableをmixinし、eachイテレータを書くことで実現できる。

class EnumDemo
  include Enumerable
  def initialize(string)
    @string = string
  end
  def each
    @string.scan(/[あいうえお]/) do |vowel|
    yield vowel
    end
  end
end
em = EnumDemo.new("あれれれれおいおい")
em.inject(:+)  # => あおいおい