Groovy脚本中的变量可见性
我创建了一个Groovy脚本中的变量可见性,groovy,Groovy,我创建了一个temp.groovy脚本: def loggedMessages = []; def log(message) { loggedMessages << message; } log "Blah" print loggedMessages.join('\n') 为什么log方法看不到loggedMessages变量?很明显,我对正在发生的事情有一个根本性的误解。我试图阅读文档,但似乎找不到相关部分。从评论中,作为回答: 状态(在最后一节3.4变量中)为:
temp.groovy
脚本:
def loggedMessages = [];
def log(message) {
loggedMessages << message;
}
log "Blah"
print loggedMessages.join('\n')
为什么log方法看不到loggedMessages变量?很明显,我对正在发生的事情有一个根本性的误解。我试图阅读文档,但似乎找不到相关部分。从评论中,作为回答: 状态(在最后一节3.4变量中)为: 如果变量的声明与第一个示例中的一样[使用类型定义],则它是一个局部变量。它将在编译器将生成的run方法中声明,并且在脚本主体之外不可见。特别是,这样的变量在脚本的其他方法中不可见 此外:如果变量未声明,它将进入脚本绑定。从方法[…]可以看到绑定 因此,从
loggedMessages
中删除def
可以修复错误:
loggedMessages = [];
def log(message) {
loggedMessages << message;
}
log "Blah"
print loggedMessages.join('\n')
loggedMessages=[];
def日志(消息){
loggedMessages我认为答案是正确的。在第3.4页变量的末尾:“它[变量]将在编译器生成的run方法中声明,并且在脚本主体之外不可见。特别是,这样的变量在脚本的其他方法中不可见。”。此外,它还提到删除类型定义(或def
)将使其可用于其他方法。因此,当我实例化loggedMessages
或使用@groovy.transform.Field
对其进行注释时,我需要删除def
。这很有效!谢谢。如果您想了解要点,请将此移到答案。另一种解决方法是将log
方法作为闭包:重写行def日志(消息){
asdef日志={message->
。
loggedMessages = [];
def log(message) {
loggedMessages << message;
}
log "Blah"
print loggedMessages.join('\n')