1

私はたくさんのものを見ます

include ActiveRecord::XXXX::InstanceMethods
extend ActiveRecord::XXXX::SingletonMethods

私はプロパティやそこで働いていることに気づいていません。わかりやすい答えが欲しかっただけです。使用する正当な理由がある場合。

4

2 に答える 2

7

これは、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 によって書かれたこのすばらしい記事もチェックしてください。

于 2009-11-11T12:45:49.767 に答える
2

インスタンス メソッドは、クラス内で定義したメソッドであり、そのクラスの 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
于 2009-11-11T12:43:41.633 に答える