Ruby on Railsのincludeとextendについて

2539 ワード

モジュールから方法,変数を導入することで,プログラミングが簡単になり,拡張性が強くなり,従来のクラスの継承よりも柔軟になる.このような導入は、メソッドブロックを、参照したクラスやモジュールにコピーしたようなものです.複数の相互に関係のないクラスの同じ方法を1つのモジュールに書くことができます.これにより、コードを簡素化し、Rubyの設計の初心に合致させ、プログラムをより筋道立てることができます.
Ruby on Railsの一般的な使い方
通常、参照モジュールには、次の3つのケースがあります.
1.クラス定義にモジュールを導入し、モジュール内のメソッドをクラスのインスタンスメソッドにする
このような状況は最もよく見られる.
直接includeでいいです
2.クラス定義にモジュールを導入し、モジュール内のメソッドをクラスのクラスメソッドにする
これもよくあることです
直接extendでいい
3.クラス定義にモジュールを導入し、インスタンスメソッドを導入するか、クラスメソッドを導入するか
この時はincludeを使う必要がありますが、
しかし、モジュールではクラスメソッドの定義が異なる、定義はselfに現れる.includedブロック
def self.included(c) ... end中
Ruby on Railsの例説明
 
#    
module Base  
  #    
  def show  
    puts "You came here!"  
  end  
end  
class Car  
  extend Base   #      ,      Car.show    
end  
class Bus  
  include Base  #       ,    Bus.new.show    
end 

しかし、ベースクラスがインスタンスメソッドを拡張したり、クラスメソッドを拡張したりするのに十分な強さを望んでいることがよくあります.Ruby on Railsもソリューションを提供しています.
 
#    
module Base  
  def show  
    puts "You came here!"  
  end  
 
  #       
  def self.included(base)  
    def base.call  
      puts "I'm strong!"  
    end  
    base.extend(ClassMethods)  
  end  
 
  #     
  module ClassMethods  
    def hello  
      puts "Hello baby!"  
    end  
  end
end  
 
class Bus  
  include Base  
end 

このときBusはインスタンスメソッドshow,クラスメソッド:call,hello,アクセス方式を備えている.
Bus.new.show  
Bus.call  
Bus.hello 

このような疑問も提起されているに違いないが、extendを使ってこの機能を実現できるのだろうか.
答えは:まだ見つかっていません.見つかったら明示してください.ありがとうございます.
私も以下の実験をしたことがありますが、結果は成功しませんでした.ここにも貼ってあります.ヒントを与えてほしいです.
 
#    
module Base  
  def show  
    puts "You came here!"  
  end  
    
    #        
  def self.extended(base)  
    base.extend(InstanceMethods)  
  end  
 
  module InstanceMethods  
    def love  
      puts 'We are instances,loving each other!'  
    end  
  end
end  
 
class Car  
  extend Base  
end 

しかし,インスタンスメソッドの拡張に失敗し,クラスメソッドを拡張した.
 
Car.show  
Car.love             #     
Car.new.love      #undefined method 'love'