私はたくさんのものを見ます
include ActiveRecord::XXXX::InstanceMethods
extend ActiveRecord::XXXX::SingletonMethods
私はプロパティやそこで働いていることに気づいていません。わかりやすい答えが欲しかっただけです。使用する正当な理由がある場合。
これは、Mixin として使用することを目的とした Ruby モジュールで機能/拡張機能をカプセル化する場合に通常採用される、書かれていない規則です。
module Bar
def beta
puts "I'm beta"
end
end
class Foo
include Bar
def alpha
puts "I'm alpha"
end
end
Foo.new.beta
# => "I'm beta"
Mixin がいくつかのインスタンス メソッドを提供するだけの単純な場合もあれば、元のクラスをインスタンス メソッドとクラス メソッドの両方で拡張する必要がある場合もあります。Ruby の次の構文は無効です。
module Bar
def beta
puts "I'm beta"
end
def self.class_beta
puts "I'm class-beta"
end
end
class Foo
include Bar
def alpha
puts "I'm alpha"
end
end
Foo.new.beta
# => "I'm beta"
Foo.class_beta
# => invalid
つまり、で定義されたメソッドを持つモジュールを含めることはできませんself
。
このため、モジュールを 2 つのサブモジュールに分割してself.included
フックを使用するのが一般的です。
module Bar
def self.included(base)
base.extend ClassMethod
base.send :include, InstanceMethods
end
module ClassMethods
def class_beta
puts "I'm class-beta"
end
end
module InstanceMethods
def beta
puts "I'm beta"
end
end
end
class Foo
include Bar
def alpha
puts "I'm alpha"
end
end
Foo.new.beta
# => "I'm beta"
Foo.class_beta
# => "I'm class beta"
また、Yehuda Katz によって書かれたこのすばらしい記事もチェックしてください。
インスタンス メソッドは、クラス内で定義したメソッドであり、そのクラスの INSTANCES に送信されます。Singletom またはクラス メソッドは、CLASS オブジェクトに送信されるクラス内で定義されたメソッドです。簡単な例として:
Class A
def instance_method
puts "Hi, I'm an instance method"
end
def self.singleton_method
puts "Hi, I'm a singleton method"
end
end
次のように呼び出します。
singleton:
A.singleton_method
instance_method:
a = A.new
a.instance_method