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