1
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调用方法?extendBBAextend

4

4 回答 4

3

include B添加B的方法,A因此您的方法定义将覆盖B的实现。

您可以使用该alias方法保存对B's 方法的引用并在以下位置实现您自己的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
于 2012-08-17T09:48:34.263 回答
1

也许猴子补丁可以解决这个问题。

module B
  alias original_stub stub
  alias b_extend extend
  def stub
    b_extend
  end
end

但是如果你的项目确实有很多对原始存根的调用......每个调用都应该被修改。

于 2012-08-17T09:42:38.520 回答
1
def a.extend
  self.class.ancestors[1].instance_method(:extend).bind(self).call
end
于 2012-08-17T09:54:03.793 回答
1

我只是又一次尝试。

A.class_eval do
 if self.include? B
   def extend
     super
   end
  end
end

A.new.stub
#=> B:extend

如果这是错误的方法,请纠正我。

于 2012-08-17T10:39:11.553 回答