Groovy:if-then语句有局部作用域吗?

Groovy:if-then语句有局部作用域吗?,groovy,if-statement,scope,Groovy,If Statement,Scope,我不确定我问的是否正确,但我有如下几点: def x = 1 if (x == 1) { def answer = "yes" } println answer 我得到错误-没有这样的属性:类的答案 然而,这是可行的: def x = 1 def answer = '' if (x==1) { answer = "yes" } println answer 这是因为变量在If语句中时具有局部作用域吗?是否有更好的方法对此进行编码,或者我只需要首先在

我不确定我问的是否正确,但我有如下几点:

def x = 1    
if (x == 1) {
   def answer = "yes"
   }
   println answer
我得到错误-没有这样的属性:类的答案

然而,这是可行的:

def x = 1
def answer = ''
if (x==1) {
   answer = "yes"
   }
   println answer

这是因为变量在If语句中时具有局部作用域吗?是否有更好的方法对此进行编码,或者我只需要首先在If语句之外声明所有变量?

是的,您必须在外部范围内声明变量

Principle #1: "A variable is only visible in the block it is defined in 
and in nested blocks".
有关作用域的更多信息:

如果这是一个脚本,那么@0lukasz0所说的并不是100%正确,因为:

def x = 1
if( x == 1 ) {
  // answer is previously undefined -- note no `def`
  answer = "yes"
}
println answer

当变量
answer
进入当前脚本的绑定时仍然有效(因为它前面没有
def
),因此可以在
if
块之外访问(上面的脚本打印
yes

您可以使用条件运算符初始化这样的变量

def x = 1    
def answer = x == 1? "yes" : null
println answer
如果要初始化多个变量,Groovy还支持多重赋值

def (i, j, k) = x == 1? [ 1, 2, 3 ] : []
println "$i $j $k"