Уточните метод класса драгоценного камня

Я должен обернуть некоторое поведение вокруг внешнего драгоценного камня в изящной и изолированной манере. Учитывая приведенную ниже абстракцию, все идет гладко, но "bar" никогда не печатается. Может кто-нибудь сказать мне, почему?

Мой код:

module RefineGem
  refine GemMainModule::GemClass do
    def self.foo
      p 'bar'
      super
    end
  end
end

module Test
  using RefineGem

  def test
    GemMainModule::GemClass.foo
  end
end

class Testing
  include Test
end

Testing.new.test

Gem код:

module GemMainModule
  class Base
    include GemMainModule::Fooable
  end

  class GemClass < Base
  end
end

module GemMainModule
  module Fooable
    extend ActiveSupport::Concern

    class_methods do
      def foo
        p 'zoo'
      end
    end
  end
end

1 ответ

Решение

Я сомневаюсь, что уточнения работают для методов класса. Вы могли бы уточнить singleton_class хоть:

module RefineGem
  refine GemMainModule::GemClass.singleton_class do
    def foo
      p 'bar'
      super
    end
  end
end

Я лично предпочитаю использовать Module#prepend для достижения той же функциональности:

GemMainModule::GemClass.singleton_class.prepend(Module.new do
  def foo
    p 'bar'
    super
  end
end)
Другие вопросы по тегам