2009-11-11 3 views
1

Я вижу много вещейЧто SingletonMethods и InstanceMethods в Рубине

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

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

ответ

6

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

Кроме того, check out this great статья написана Иегуда Кац.

+0

Гораздо более распространено не иметь модуль «InstanceMethods», а просто включать эти методы в тело модуля «Бар». Что делает Rails с помощью модуля InstanceMethods? –

+0

Кен Блум: Ясность? Я делал это сам, когда я был незнаком с идиомой – guns

2

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