Удалить метод одиночного метакласса - PullRequest
7 голосов
/ 30 апреля 2010

Я начал изучать Groovy и сейчас изучаю функциональность метакласса. Я видел примеры добавления нового метода и удаления всех методов, но ничего об удалении одного метода. Например:

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

с явными побочными эффектами. Теперь я видел, что вы можете сказать

String.metaClass = null

Чтобы удалить все методы. Я ожидаю, что можно сказать что-то вроде

String.metaClass.foo = null

чтобы удалить String.foo (), но String.bar () останется, однако это утверждение, похоже, не имеет никакого эффекта Есть ли способ сказать, что метод foo () больше не должен определяться без влияния на bar () или другие добавленные методы?

Ответы [ 2 ]

7 голосов
/ 30 апреля 2010

Если вы ищете на этой веб-странице слово «метод удаления», это говорит о том, что вы сможете удалить метод, используя тот синтаксис, который вы предложили выше. Но я проверил это, и вы правы, похоже, это не работает.

Обходной путь - назначить замыкание, которое выдает MissingMethodException, что и происходит по умолчанию при вызове метода, который не существует, например,

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

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

Правда, это не самое приятное решение.

2 голосов
/ 07 мая 2010

В качестве продолжения я разместил сообщение об ошибке здесь:

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

И документация была изменена сейчас

См. Отчет об ошибке по той причине, что это никогда не было реализовано

Ответ Дона - лучший способ обойти это

...