Ruby中的SingletonMethods和InstanceMethods是什么?

T.R*_*dra 1 ruby singleton class instance

我看到了很多东西

include ActiveRecord::XXXX::InstanceMethods
extend ActiveRecord::XXXX::SingletonMethods
Run Code Online (Sandbox Code Playgroud)

我不知道财产或工作,只是想要一个容易理解的答案.如果它有充分的理由被使用.

Sim*_*tti 7

当你想要在Ruby模块中封装功能/扩展以供用作Mixin时,这是一个通常采用的非编写约定.

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"
Run Code Online (Sandbox Code Playgroud)

有时,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
Run Code Online (Sandbox Code Playgroud)

也就是说,您不能包含定义方法的模块self.

出于这个原因,将模块拆分为两个子模块并使用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"
Run Code Online (Sandbox Code Playgroud)

另外,请查看 Yehuda Katz撰写的这篇精彩文章.