は、rubygem 工夫はなぜここextend
を使うlib/devise/controllers/helpers.rb
人々はモジュール定義で拡張を使用するのはなぜですか?例えば
module Helpers
extend ActiveSupport::Concern
で次のコードを持っていますか? include
も同じですか?
は、rubygem 工夫はなぜここextend
を使うlib/devise/controllers/helpers.rb
人々はモジュール定義で拡張を使用するのはなぜですか?例えば
module Helpers
extend ActiveSupport::Concern
で次のコードを持っていますか? include
も同じですか?
いいえ、include
は同じことをしません。
extend
およびinclude
は、類似しているが異なる役割を果たします。 include
は、含まれているモジュールのインスタンスメソッドを取り、包含するモジュールのインスタンスに利用可能にします。実際には、include
は、含まれているモジュールをそのスーパークラスとして挿入します(実際には、#ancestors
は含まれるモジュールを表示します)。一方、受信機に、指定されたモジュールのメソッドを追加する。0123モジュール定義の間にextend
を呼び出す場合、それは "拡張"モジュールのインスタンスメソッドが "拡張"モジュールのクラスメソッドになることを意味します。デコレータ(実際にはクラスメソッドへの呼び出し)を定義されているクラスまたはモジュールにインポートするためによく使用されます。
簡単に言うと、上のスニペットはActiveSupport::Concern
のインスタンスメソッドをとり、Helpers
のクラスメソッドにします。
基本的には、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
グレート!今、私は分かる。 〜 – Tao
ありがとうございました**デコレータ**についてもっと説明できますか?それは何ですか? – Tao
'attr_accessor'とフレンドはデコレータで、' has_many'、 'belongs_to'などもRailsからです。これは、特定の機能を追加するためにクラスを定義するときに技術的にメソッド呼び出しと呼ばれるものを総称しています。彼らはクラスについてのステートメントのように見える傾向があります。 – Chowlett