extend self
и module_function
два рубиновых пути состоят в том, чтобы сделать его так, можно назвать метод на модуле и также назвать его при включении того модуля.
Есть ли какие-либо различия между конечными результатами тех путей?
module_function
делает методы данного экземпляра приватными, затем дублирует и помещает их в метакласс модуля как публичные методы. extend self
добавляет все методы экземпляра к синглтону модуля, оставляя их видимость неизменной.
module M
extend self
def a; end
private
def b; end
end
module N
def c; end
private
def d; end
module_function :c, :d
end
class O
include M
include N
end
M.a
M.b # NoMethodError: private method `b' called for M:Module
N.c
N.d
O.new.a
O.new.b # NoMethodError: private method `b' called for O
O.new.c # NoMethodError: private method `c' called for O
O.new.d # NoMethodError: private method `d' called for O