我正在尝试覆盖位于Ruby / Rails中的Gem中的方法,我正在努力解决一些问题。
我的目标是在调用Gem的方法时执行自定义代码,同时继续执行原始代码。
我尝试将代码抽象为以下脚本:
module Foo
class << self
def foobar
puts "foo"
end
end
end
module Foo
class << self
def foobar
puts "bar"
super
end
end
end
Foo.foobar
执行此脚本会出现此错误:
in `foobar': super: no superclass method `foobar' for Foo:Module (NoMethodError)
我应该如何编写覆盖方法,以便在引发此异常时调用super?
PS:如果我删除了super,那么覆盖效果会很好,但是原来的方法没有被调用,我不希望这样。
答案 0 :(得分:12)
你可以这样做你想做的事:
module Foo
class << self
alias_method :original_foobar, :foobar
def foobar
puts "bar"
original_foobar
end
end
end
答案 1 :(得分:6)
调用super
查找方法查找链中的下一个方法。错误告诉您这里到底在做什么:foobar
的方法查找链中有Foo
方法,因为它不是从任何东西继承的。您在示例中显示的代码只是对Foo
模块的重新定义,因此让第一个Foo
无效。