我想知道用init,enter和exit方法来完成类似于Python的上下文管理器的常规方法是什么。这是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
答案 0 :(得分:2)
如果需要自己的入口点,则可以编写自己的基类来控制这种行为。
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
答案 1 :(得分:0)
Groovy可以使用元编程为进入和退出完成类似的操作。 Groovy具有运行时和编译时元编程。使用运行时元编程,您可以通过在类中使用invokeMethod来执行类似的操作。
编译时元编程要困难一些,因为您要在编译器级别进行处理:
我制作了一个Grails插件,这将是一个更加复杂的示例,它使我可以执行类似的操作,但调用方法周围的闭包:
希望其中一些帮助...