防止在Groovy中从函数作用域创建全局变量



在Groovy中,当这个函数运行时,它将创建一个全局变量z:

def defineGlobalVariable() {
z = "hello"
}
defineGlobalVariable()
println(z)
// prints "hello"

我有一个Groovy脚本,其中有许多函数,没有意识到,它们的所有变量都以这种方式定义为全局变量。当我尝试并发运行一些函数时,这会导致问题,因为它们改变了相同的全局变量,认为它是局部的作用域。

我想将所有全局变量定义更改为本地(例如将z = "hello"更改为def z = "hello")。我可以尝试用一些正则表达式找到并替换它们,但我想知道是否有一种方法可以告诉groovy脚本将所有变量定义视为本地。像这样:

def defineGlobalVariable() {
z = "hello"
}
preventGlobalVariablesFromFunctions()
defineGlobalVariable()
println(z)
// fails - z doesn't exist in this scope

如果这样的东西不存在,什么是最安全的方法来查找和替换所有的全局定义?

编辑澄清:理想情况下,我正在寻找一个解决方案,只会防止创建一个全局变量,但仍然允许赋值到它。扩展前面的例子:

def shouldWork = "hi"
def assignToGlobalVariable() {
shouldWork = "hello"
}
def defineGlobalVariable() {
shouldFail = "hello"
}
preventGlobalVariablesFromFunctions()
assignToGlobalVariable()
println(shouldWork)
// prints "hello"
defineGlobalVariable()
println(shouldFail)
// fails - `shouldFail` doesn't exist in this scope

你可以声明函数void setProperty(String k,Object v),当你试图设置"global"脚本变量。

void setProperty(String k,Object v){
throw new Exception("not allowed to set global variable `$k` to value `$v`")
}
def defineGlobalVariable() {
z = "hello"
}
defineGlobalVariable()
println(z)
//Exception thrown
//java.lang.Exception: not allowed to set global variable `z` to value `hello`

相关内容

  • 没有找到相关文章

最新更新