Что такое SingletonMethods и InstanceMethods в Ruby - PullRequest
1 голос
/ 11 ноября 2009

Я вижу много вещей

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

Я не осведомлен о собственности или там работаю, просто хотел легко понять ответ. если у него есть веские основания для использования.

Ответы [ 2 ]

7 голосов
/ 11 ноября 2009

Это неписаное соглашение, обычно применяемое, когда вы хотите инкапсулировать функции / расширения в модуль 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"

Иногда 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"

Кроме того, посмотрите эту замечательную статью , написанную Иегудой Кацем.

2 голосов
/ 11 ноября 2009

Методы экземпляра - это методы, которые вы определяете в классе и отправляются в INSTANCES этого класса. Методы синглетом или класса - это методы, определенные внутри класса, которые отправляются объекту 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
...