Как добавить классные методы
Этот вопрос напрямую связан с этим. Но я попытался разбить его на базовую проблему, и я не хотел вводить еще больше текста в другой вопрос. Итак, вот:
Я знаю, что я могу включить classmethods, расширив модуль ClassMethods и включив его через hook # include. Но могу ли я сделать то же самое с prepend? Вот мой пример:
класс Foo:
class Foo
def self.bar
'Base Bar!'
end
end
Расширения класса
:
module Extensions
module ClassMethods
def bar
'Extended Bar!'
end
end
def self.prepended(base)
base.extend(ClassMethods)
end
end
# prepend the extension
Foo.send(:prepend, Extensions)
класс FooE:
require './Foo'
class FooE < Foo
end
и простой начальный скрипт:
require 'pry'
require './FooE'
require './Extensions'
puts FooE.bar
Когда я запускаю script, я не получаю Extended Bar!
, как я ожидаю, но скорее Base Bar!
. Что мне нужно изменить для правильной работы?
Ответы
Ответ 1
Проблема заключается в том, что, даже если вы добавили модуль, ClassMethods
все еще получает extend
. In может сделать это, чтобы получить то, что вы хотите:
module Extensions
module ClassMethods
def bar
'Extended Bar!'
end
end
def self.prepended(base)
class << base
prepend ClassMethods
end
end
end
Обратите внимание, что Extensions
сам может быть либо добавлен, либо включен в Foo
. Важной частью является добавление ClassMethods
.
Ответ 2
Простая версия:
module Extensions
def bar
'Extended Bar!'
end
end
Foo.singleton_class.prepend Extensions