优化 gem 的 class 方法
Refine gem's class method
我必须以优雅且独立的方式围绕外部 gem 包装一些行为。鉴于下面的抽象,一切运行顺利,但 '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
我怀疑 class 方法的改进是否有效。不过,您可以优化 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)
我必须以优雅且独立的方式围绕外部 gem 包装一些行为。鉴于下面的抽象,一切运行顺利,但 '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
我怀疑 class 方法的改进是否有效。不过,您可以优化 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)