在下面的一段代码中(取自Groovy Semantics Manual page),为什么要在赋值前加上关键字def?
def
def x = 0 def y = 5 while ( y-- > 0 ) { println "" + x + " " + y x++ } assert x == 5
def可以删除关键字,并且此代码段将产生相同的结果。那么关键字的 作用def是什么?
它是基本脚本的语法糖。省略“def”关键字会将变量放在当前脚本的绑定中,并且 groovy 将其(主要)视为全局范围的变量:
x = 1 assert x == 1 assert this.binding.getVariable("x") == 1
使用 def 关键字不会将变量放在脚本绑定中:
def y = 2 assert y == 2 try { this.binding.getVariable("y") } catch (groovy.lang.MissingPropertyException e) { println "error caught" }
打印:“错误捕获”
在大型程序中使用 def 关键字很重要,因为它有助于定义可以找到变量的范围并有助于保持封装。
如果您在脚本中定义一个方法,它将无法访问在主脚本主体中使用“def”创建的变量,因为它们不在范围内:
x = 1 def y = 2 public bar() { assert x == 1 try { assert y == 2 } catch (groovy.lang.MissingPropertyException e) { println "error caught" } } bar()
打印“错误捕获”
“y”变量不在函数的范围内。“x”在范围内,因为 groovy 将检查当前脚本的变量绑定。正如我之前所说,这只是一种语法糖,可以使快速而肮脏的脚本更快地输入(通常是一行)。
较大脚本中的良好做法是始终使用“def”关键字,这样您就不会遇到奇怪的范围问题或干扰您不打算使用的变量。