1

あなたの同僚が Fixnum クラスにモンキーパッチを適用し、+ メソッドを再定義して、加算ではなく減算を行ったとします。

class Fixnum
  def +(x)
    self - x
  end
end

>> 5 + 3
=> 2

あなたの問題は、 + メソッドの元の機能にアクセスしたいということです。したがって、このコードを同じソース ファイル内の彼の前にドロップします。+ メソッドを「original_plus」にエイリアスしてから、モンキーパッチを適用します。

class Fixnum
  alias_method :original_plus, :+
end

class Fixnum
  def +(x)
    self - x
  end
end

+ メソッドの元の機能に original_plus からアクセスできるようになりました

>> 5 + 3
=> 2
>> 5.original_plus(3)
=> 8

しかし、私が知る必要があるのはこれです:

彼が変更したのと同じソースファイルに貼り付ける以外に、彼のmonkeypatchがロードされる前にこのエイリアスをロードする方法はありますか?

私の質問には2つの理由があります:

  1. 私がこれをしたことを彼に知られたくないかもしれません
  2. エイリアスがモンキーパッチより下になるようにソースファイルが変更された場合、エイリアスはもはや望ましい結果を生成しません。
4

2 に答える 2

6

もちろん。ソースファイルが必要になるに、コードに反モンキーパッチを貼り付けるだけです。

 % cat monkeypatch.rb
 class Fixnum
   def +(x)
     self - x
   end
 end
 % cat mycode.rb
 class Fixnum
   alias_method :original_plus, :+
 end
 require 'monkeypatch'
 puts 5 + 3 #=> 2
 puts 5.original_plus(3) #=> 8
于 2009-05-16T17:05:00.480 に答える
2

モンキーパッチは、既存のクラスを拡張し、新しい機能を追加するのに便利です。既存の機能の動作を変更するためのモンキーパッチはクレイジーです!

真剣に、あなたはあなたの同僚と話すべきです。

あなたの例のように、彼がその振る舞いを変更するためだけに既存のメソッドを再定義した場合、あなたは彼に話しかけalias_method_chain、既存の振る舞いを保存するために使用するようにアドバイスする必要があります。

于 2009-05-16T17:16:24.633 に答える