2012-03-04 34 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

相關問題