variables - 如何在 Groovy 脚本引擎中使用局部作用域变量?

标签 variables groovy scope global local

在我在 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/

相关文章:

javascript - 在 Javascript 中引用变量的正确方法

c++ - #define 与 const 声明的优先级

c++ - 在构造函数中初始化的变量不保持初始化状态 (c++)

variables - 如何使用 Javascript 在 qualtrics 中设置嵌入式数据

grails - 与messages.properties的参数有关的问题,除零以外的所有数字均可正常工作

grails - 在运行时动态设置Grails DataSource到内存中的H2实例

c++ - 为什么while的条件在do while范围之外

perl - 为什么变量仍然绑定(bind)

grails - 简单的grails rc1集成测试失败

module - 导入位于低于当前路径的路径中的 TypeScript 模块会引发范围错误