7

私は Groovy を学び始めており、現在メタクラスの機能を調べています。新しいメソッドを追加してすべてのメソッドを削除する例を見てきましたが、単一のメソッドを削除することについては何もありません。例えば:

String.metaClass.foo = {delegate.toUpperCase()}
String.metaClass.bar = {delegate.toLowerCase()}

明らかな副作用があります。今、私はあなたが言うことができることを見てきました

String.metaClass = null

すべてのメソッドを削除します。私は、人が次の線に沿って何かを言うことができると期待しています

String.metaClass.foo = null

String.foo() を削除しますが、String.bar() は残しますが、このステートメントは何の効果もないようです。bar() やその他の追加されたメソッドに影響を与えずに、メソッド foo() を定義しないようにする方法はありますか?

4

2 に答える 2

7

この Web ページで「メソッドの削除」を検索すると、上記で提案した正確な構文を使用してメソッドを削除できるはずであると表示されます。しかし、私はそれをテストしました、そしてあなたが正しいです、それはうまくいかないようです。

これMissingMethodExceptionは、存在しないメソッドを呼び出したときにデフォルトで発生します。

// Add method
String.metaClass.foo = {delegate.toUpperCase()}

// Remove method
def removeMethod = {throw new MissingMethodException()}
String.metaClass.foo = removeMethod

確かに、これは最も満足のいく解決策ではありません。

于 2010-04-30T15:42:31.207 に答える
2

フォローアップとして、ここにバグレポートを投稿しました:

https://issues.apache.org/jira/browse/GROOVY-4189

そして、ドキュメントは現在変更されています

これが実装されなかった理由については、バグレポートを参照してください

ドンの答えはこれを回避する最良の方法です

于 2010-05-07T13:26:42.467 に答える