Это не написанные конвенции обычно принимается, если вы хотите, чтобы инкапсулировать функции/расширение в модуле 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 статья написана Иегуда Кац.
Гораздо более распространено не иметь модуль «InstanceMethods», а просто включать эти методы в тело модуля «Бар». Что делает Rails с помощью модуля InstanceMethods? –
Кен Блум: Ясность? Я делал это сам, когда я был незнаком с идиомой – guns