次の方法で、Groovy の plus メソッドを「台無し」にしたいと思います。
Integer.metaClass.plus {Integer n -> delegate + n + 1}
assert 2+2 == 5
私は StackOverflowException を取得しています (これは驚くべきことではありません)。
メタクラスのクロージャ内で「オリジナル」とメソッドを使用する方法はありますか?
次の方法で、Groovy の plus メソッドを「台無し」にしたいと思います。
Integer.metaClass.plus {Integer n -> delegate + n + 1}
assert 2+2 == 5
私は StackOverflowException を取得しています (これは驚くべきことではありません)。
メタクラスのクロージャ内で「オリジナル」とメソッドを使用する方法はありますか?
かっこいい慣用的な方法は、古いメソッドへの参照を保存し、新しいメソッド内で呼び出すことです。
def oldPlus = Integer.metaClass.getMetaMethod("plus", [Integer] as Class[])
Integer.metaClass.plus = { Integer n ->
return oldPlus.invoke(oldPlus.invoke(delegate, n), 1)
}
assert 5 == 2 + 2
これは実際にはそれほど十分に文書化されておらず、私はこの正確なトピックについて今夜または明日ブログに投稿することを計画していました:)。
これを使用してプラスの方法を「台無し」にします。
Integer.metaClass.plus {Integer n -> delegate - (-n) - (-1)}
assert 2+2 == 5
当然のことながら、plus メソッドのオーバーロードで「+」演算子を使用すると StackOverflow が発生するため、「+」演算子以外のものを使用する必要があります。
その他のメカニズム: XOR またはビット演算子マジックを使用します。
よろしく、ピースフルファイア