Как упомянул @Karthik, вы можете иметь класс include
и extend
для модуля:
module Mod1
def method1
'hi'
end
end
class A
end
A.include Mod1
A.extend Mod1
A.new.method1 #=> 'hi'
A.method1 #=> 'hi'
A.extend Mod1
не более чем
A.singleton_class.include Mod1
Когда это должно быть сделано, нет ничего необычного в том, чтобы модуль был написан следующим образом.
module Mod1
def method1
'hi'
end
def self.included(klass)
klass.extend(self)
end
end
В этом случае модуль должен быть только include
d по классу:
class A
end
A.include Mod1
A.new.method1 #=> 'hi'
A.method1 #=> 'hi'
Модуль :: включен называется методом обратного вызова или hook . A.include Mod1
заставляет Mod1::included
выполняться с klass
, равным A
и self
, равным Mod1
.
Кроме того, есть несколько других методов обратного вызова, которые могут быть использованы для хорошего эффекта. Возможно, наиболее важными являются Module :: extended , Module :: prepended и Class :: наследуется .