Если вы хотите добавить метод в класс Module
, вы просто добавляете метод в класс Module
:
class Module
def base
# ...
end
end
В вашем коде вы использовали
def self.base
# ...
end
Этот синтаксис (def foo.bar
) является синтаксисом для добавления одноэлементного метода с именем bar
к объекту, на который ссылается foo
, который на самом деле просто добавляет метод обычного экземпляра к классу синглтона объекта, на который ссылаетсяby foo
.
Итак, в вашем коде вы добавляли одноэлементный метод с именем base
к объекту, на который ссылается self
, который внутри class_eval
является самим объектом класса, в данном случаеModule
.Причина, по которой одноэлементные методы называются одноэлементными методами, заключается в том, что они существуют только в одном объекте.В вашем случае метод base
существует только для объекта Module
, но не для любого другого объекта и, в частности, не для объекта User
.Другими словами: only способ вызова метода base
- это Module.base
, потому что это единственный объект, к которому вы добавили его.
Мне потребовалось довольно много временипробраться через ваши три (!) вложенных class_eval
s, чтобы узнать, чего вы пытаетесь достичь.Что не облегчается тем фактом, что ваш код даже не работает, даже , если определен в правильном классе, потому что def
создает новую область видимости, и поэтому block
не определен всамое внутреннее class_eval
.
Очевидно, что вы пытаетесь сделать это:
class Module
def base(&block)
define_singleton_method(:included) do |base|
base.class_eval(&block)
end
end
end