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.

出于这个原因,将模块拆分为两个子模块并使用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

实例方法是您在一个类中定义的方法,这些方法被发送到该类的实例。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 回答