Удалите единственный метод метакласса

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

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

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

String.metaClass = null

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

String.metaClass.foo = null

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

7
задан M. Jessup 30 April 2010 в 15:22
поделиться

2 ответа

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

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

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

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

По общему признанию, это не самое приятное решение.

7
ответ дан 7 December 2019 в 03:13
поделиться

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

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

И документация теперь изменена

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

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

.
2
ответ дан 7 December 2019 в 03:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: