优化宝石的类方法

时间:2017-11-10 12:43:37

标签: ruby ruby-on-rails-5 refinements

我必须以优雅和孤立的方式围绕外部宝​​石包裹一些行为。鉴于下面的抽象,一切都运行顺利,但“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

宝石代码:

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 个答案:

答案 0 :(得分:2)

我怀疑改进是否适用于类方法。您可以优化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)