module B
def stub
extend()
end
def extend
puts "B:extend"
end
end
class A
include B
def extend
puts "A:extend"
end
end
a = A.new
a.stub
# output: A:extend
# would like to have: B:extend
问题是:
如何在不修改a.stub
代码且不重命名extend
的方法B
的情况下,从模块B
调用A
调用extend
方法?< / p>
答案 0 :(得分:3)
include B
将B
的方法添加到A
,因此您的方法定义会覆盖B
的实现。
您可以使用alias
方法保存对B
方法的引用,并在stub
中实施您自己的A
方法:
class A
include B
alias :b_extend :extend
def stub
b_extend
end
def extend
puts "A:extend"
end
end
A.new.stub
# B:extend
答案 1 :(得分:1)
也许猴子补丁可以解决这个问题。
module B
alias original_stub stub
alias b_extend extend
def stub
b_extend
end
end
但是如果你的项目确实有多次调用原始存根...应该修改每个调用。
答案 2 :(得分:1)
def a.extend
self.class.ancestors[1].instance_method(:extend).bind(self).call
end
答案 3 :(得分:1)
我的另一次尝试。
A.class_eval do
if self.include? B
def extend
super
end
end
end
A.new.stub
#=> B:extend
如果这是一种错误的方法,请纠正我。