Уточните метод класса драгоценного камня
Я должен обернуть некоторое поведение вокруг внешнего драгоценного камня в изящной и изолированной манере. Учитывая приведенную ниже абстракцию, все идет гладко, но "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)