2012-03-04 38 views
2

在groovy脚本引擎上运行的groovy脚本中,所有变量似乎都是全局变量。我做了一些常规课,但是当我做变量时,可以从任何地方访问它们。例如。如何在Groovy脚本引擎中使用本地作用域变量?

class test{ 
    void func1{ a=4 } 
    void func2{ print(a) } 
} 

当我从scala调用这个类函数func1然后调用func2,它会导致“4”。奇怪的是,如果我在函数中声明像“def a = 0”这样的变量,变量的作用域将被限制在函数中。

我加载我的Groovy脚本从的GroovyScriptEngine所示(使用斯卡拉)

var gse = new GroovyScriptEngine(pathList.toArray) 
var scriptClass = gse.loadScriptByName(file.getName()) 
var i = scriptClass.newInstance().asInstanceOf[GroovyObject] 

然后使用invokeMethod中调用的脚本槽类的功能。无论如何,默认情况下,变量作用域的功能是有限的吗?

回答

2

这是预期的行为,描述在Scoping and the Semantics of "def"

在Groovy脚本中使用未声明的变量会创建一个绑定变量。绑定变量对您的脚本是全局的。如果您用def声明变量,它将变成本地函数。

此行为仅适用,因为您将代码作为脚本加载。我不相信它有可能改变它。当需要本地变量时,只需使用声明(def或类型)。

请注意,您还可以通过使用@Field注解定义一个变量绑定(全球):

class test { 
    void func1{ @Field int a=4 } 
    void func2{ print(a) } 
} 

相当于

class test { 
    void func1{ a=4 } 
    void func2{ print(a) } 
} 
+0

谢谢你这是困扰我 – Elonoa 2012-03-05 04:38:15

相关问题