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 BBのメソッドを に追加するため、メソッド定義はの実装Aを上書きします。B

メソッドを使用して のaliasメソッドへの参照を保存し、独自のメソッドを にB実装できます。stubA

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

私のちょうど別の試み。

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 に答える
1
def a.extend
  self.class.ancestors[1].instance_method(:extend).bind(self).call
end
于 2012-08-17T09:54:03.793 に答える
1

モンキーパッチで解決できるかもしれません。

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

ただし、プロジェクトに元のスタブへの呼び出しが多数ある場合は、各呼び出しを変更する必要があります。

于 2012-08-17T09:42:38.520 に答える