Init / Enter / Exit аналог контекстного менеджера в groovy? - PullRequest
0 голосов
/ 23 июня 2019

Мне интересно, каков отличный способ сделать что-то похожее на менеджер контекста Python, с его методами init, enter и exit. Вот основной пример в Python:

class ContextManager(): 
    def __init__(self): 
        print('init method called') 

    def __enter__(self): 
        print('enter method called') 
        return self

    def __exit__(self, exc_type, exc_value, exc_traceback): 
        print('exit method called') 


with ContextManager() as manager: 
    print('with statement block') 

Выход:

init method called
enter method called
with statement block
exit method called

Ответы [ 2 ]

2 голосов
/ 24 июня 2019

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

class ContextManager {
    ContextManager() { println "init" }
    void enter() { println "enter" }
    void exit(Throwable t=null) { println "exit ${t?:""}" }
    String getInner() { "inner" }

    final run(Closure f) {
        try {
            enter()
            f(this)
            exit()
        }
        catch (Throwable t) {
            exit(t)
        }
    }
}

def outer = "outer"

new ContextManager().run { manager ->
    println outer
    println manager.inner
    println "body"
}

Вывод:

init
enter
outer
inner
body
exit 
0 голосов
/ 23 июня 2019

Groovy может выполнить нечто подобное для входа и выхода, используя метапрограммирование. Groovy имеет метапрограммирование как во время выполнения, так и во время компиляции. С метапрограммированием во время выполнения вы можете сделать нечто подобное, используя invokeMethod в классе.

Метапрограммирование во время компиляции немного сложнее, потому что вы работаете на уровне компилятора:

Я создал плагин Grails, который был бы гораздо более сложным примером, который позволяет мне делать нечто подобное, но вызывать замыкания вокруг методов:

Надеюсь, что это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...