Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy脚本中的变量可见性_Groovy - Fatal编程技术网

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日志(消息){
as
def日志={message->
loggedMessages = [];

def log(message) {
    loggedMessages << message;
}

log "Blah"

print loggedMessages.join('\n')