2011-07-22 6 views

答えて

3

いいえ、includeは同じことをしません。

extendおよびincludeは、類似しているが異なる役割を果たします。 includeは、含まれているモジュールのインスタンスメソッドを取り、包含するモジュールのインスタンスに利用可能にします。実際には、includeは、含まれているモジュールをそのスーパークラスとして挿入します(実際には、#ancestorsは含まれるモジュールを表示します)。一方、受信機に、指定されたモジュールのメソッドを追加する。0123モジュール定義の間にextendを呼び出す場合、それは "拡張"モジュールのインスタンスメソッドが "拡張"モジュールのクラスメソッドになることを意味します。デコレータ(実際にはクラスメソッドへの呼び出し)を定義されているクラスまたはモジュールにインポートするためによく使用されます。

簡単に言うと、上のスニペットはActiveSupport::Concernのインスタンスメソッドをとり、Helpersのクラスメソッドにします。

+0

グレート!今、私は分かる。 〜 – Tao

+0

ありがとうございました**デコレータ**についてもっと説明できますか?それは何ですか? – Tao

+0

'attr_accessor'とフレンドはデコレータで、' has_many'、 'belongs_to'などもRailsからです。これは、特定の機能を追加するためにクラスを定義するときに技術的にメソッド呼び出しと呼ばれるものを総称しています。彼らはクラスについてのステートメントのように見える傾向があります。 – Chowlett

2

基本的には、Object#extendだけです:メソッドは、異なるクラスで終わるので、

class Object 
    def extend(*ms) 
    ms.each do |m| 
     class << self 
     include m # Obviously, this won't work since m isn't in scope 
     end 
    end 
    end 
end 

だから、それは、彼らは明らかにない同じであることを確認するために簡単です。 Object#extend


を作業していて、あまり目立たないバージョンは、次のようになります。

class Object 
    def extend(*ms) 
    ms.each do |m| 
     singleton_class.send :include, m # Because Module#include is private 
    end 
    end 
end 
関連する問題