Подтвердить что ты не робот

Как добавить классные методы

Этот вопрос напрямую связан с этим. Но я попытался разбить его на базовую проблему, и я не хотел вводить еще больше текста в другой вопрос. Итак, вот:

Я знаю, что я могу включить 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!. Что мне нужно изменить для правильной работы?

4b9b3361

Ответ 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