どのようにmixを入れる方法、クラスの方法になります



 
どのようにmixを入れる方法、クラスの方法になります
【例1】
 
 
module MyModule
  def a_method
    puts "hello, MyModule#a_method"
  end
end

class E
  include MyModule
end

E.new.a_method

 
 
classでinclude Moduleのメソッドを使用すると、moduleのメソッドはclassのインスタンスメソッドになります.
【例2】
 
 
 
module MyModule
  def self.a_method
    puts "hello, MyModule#a_method"
  end
end

class E
  include MyModule
end

E.new.a_method
E.a_method

 
 
モジュールメソッドがincludeされる場合,クラスメソッドとしてもインスタンスメソッドとしても機能しない.
 
【例3】
 
 
module MyModule
  def a_method
    puts "hello, MyModule#a_method"
  end
end

class E
  class << self
    include MyModule
  end
end

E.a_method 
#=> hello, MyModule#a_method

この方法はModuleのメソッドをクラスEのeigenclassに導入することであり,eigenclassについては複雑であるが,メソッド呼び出し時にクラス対応のeigenclassで検索し(各クラスに対応するeigenclassが1つある),なければ親クラスで検索するという意味である.
 
 
【例4】
 
 
module MyModule
  def a_method
    puts "hello, MyModule#a_method"
  end
end

obj = Object.new
obj.extend(MyModule)
obj.a_method

class E
  extend MyModule
end

E.a_method

#=> hello, MyModule#a_method
#=> hello, MyModule#a_method

 
extendメソッドは,実際にはModuleメソッドをクラスのeigenclassに組み込む.