Модуль можно использовать как пространство имен путем написания методов модуля, а методы экземпляра модуля можно смешивать с другим объектом.
Концепция саморасширяющегося модуля позволяет использовать модуль обоими способами; или как отдельное пространство имен, или как миксин. Рассмотрим этот модуль:
module M
def bar
puts "bar"
end
end
class C
include M
end
Он имеет метод экземпляра и может быть смешан с другим объектом. У него нет метода модуля, и поэтому его нельзя использовать в качестве пространства имен:
puts M::bar # => undefined method `bar' for M:Module
puts C.bar # => this is bar
Но модуль - это просто объект класса Module
, как мы можем продемонстрировать
puts M.class # => Module
Это значит, что мы можем сделать что-то сумасшедшее. Мы можем встроить модуль в себя, чтобы его методы стали методами экземпляра и модуля.
module M
extend self
def bar
puts "bar"
end
end
puts M::bar # => this is bar
puts C.bar # => this is bar