在我在 groovy 脚本引擎上运行的 groovy 脚本中,所有变量似乎都是全局的。我创建了一些常规类,但是当我创建变量时,可以从任何地方访问它们。例如。
class test{
void func1{ a=4 }
void func2{ print(a) }
}
当我从 scala 调用此类函数 func1 然后调用 func2 时,结果为“4”。奇怪的是,如果我在函数中声明像“def a=0”这样的变量,变量的范围将受到函数中的限制。
我正在像这样从 GroovyScriptEngine 加载我的 groovy 脚本(使用 scala)
var gse = new GroovyScriptEngine(pathList.toArray)
var scriptClass = gse.loadScriptByName(file.getName())
var i = scriptClass.newInstance().asInstanceOf[GroovyObject]
然后使用invokeMethod调用groove脚本类中的函数。无论如何,默认情况下是否可以将变量范围限制在函数中?
最佳答案
这是预期的行为,如 Scoping and the Semantics of "def" 中所述。 .
在 Groovy 脚本中使用未声明的变量会创建绑定(bind)变量。绑定(bind)变量对于您的脚本来说是全局的。如果您使用 def
声明变量,它将成为函数局部变量。
此行为仅适用于您将代码作为脚本加载的情况。我不相信有可能改变它。当您需要局部变量时,只需使用声明(def
或类型)即可。
请注意,您还可以使用 @Field 注释定义绑定(bind)变量(全局):
class test {
void func1{ @Field int a=4 }
void func2{ print(a) }
}
相当于
class test {
void func1{ a=4 }
void func2{ print(a) }
}
关于variables - 如何在 Groovy 脚本引擎中使用局部作用域变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9555988/