ruby192:具体方法调用

时间:2012-08-17 09:14:05

标签: ruby

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>

4 个答案:

答案 0 :(得分:3)

include BB的方法添加到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

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