Groovy';s";“可选返回”;语义学

Groovy';s";“可选返回”;语义学,groovy,return,Groovy,Return,在Groovy中,允许您编写以下方法: def add(a, b) { a + b } …它添加a和b,并将结果返回给调用者 然而,我想知道当方法有多个返回“语句”时,语义是什么。例如,在Java中,您可能有: String append(String a, String b) { if (a == null) { return b; } return a + b; } 这可以(假设)转化为Groovy: def append(a, b) {

在Groovy中,允许您编写以下方法:

def add(a, b) {
    a + b
}
…它添加
a
b
,并将结果返回给调用者

然而,我想知道当方法有多个返回“语句”时,语义是什么。例如,在Java中,您可能有:

String append(String a, String b) {
    if (a == null) {
        return b;
    }
    return a + b;
}
这可以(假设)转化为Groovy:

def append(a, b) {
    if (! a) {
        b
    }
    a + b
}
然而,在这种情况下,Groovy如何知道应该返回
if
语句内部的
b
?还是没有?我假设Groovy不能简单地将结果未使用的任何语句视为
返回,对吗?在这种情况下,“可选返回”特性的行为是否有明确定义的语义

您链接的页面(相当简洁)描述了确切的语义:

请注意,return语句在方法末尾是可选的

因此,
if
块中的
b
将永远不会返回,除非您显式地返回它。实际上,这意味着返回值将是最后一个求值语句的结果,因此如果您的示例

def append(a, b) {
   if (!a) { b }
   else { a + b }
}
def append(a,b) {
   if (!a) { b }
   else { a + b }
   println "debug: $a $b"
}
如果
,那么结果将是
b
!a
,而
a+b
为假

调用
void
函数的结果是
null
,因此如果示例为

def append(a, b) {
   if (!a) { b }
   else { a + b }
}
def append(a,b) {
   if (!a) { b }
   else { a + b }
   println "debug: $a $b"
}
然后,
append
将始终返回
null


我自己的经验法则是,如果方法或闭包包含多个语句,则始终使用显式返回语句。我认为在更复杂的方法中依赖隐式return语句是危险的,因为如果有人在方法末尾添加一行,他们将更改返回值,即使他们很可能并不打算这样做。

是有意义的。虽然如果我做了
或者{a+b}
?在这种情况下,
b
将位于方法的“末尾”,因为后面没有可执行语句。我添加了两个额外的示例来详细说明可选返回语义在实践中的含义。我的经验法则是在方法中使用返回,而不在闭包中使用,但我是一个老程序员,我的眼睛希望看到所有显式返回(守护条款、早期退出和最终结果)。这也有助于我的闭包趋向于简单的内联类型,在这种类型中,添加的简洁性是值得赞赏的。事实上,这是groovy的另一个(有时)被误解的功能倾向。在几种函数式语言中,返回语句总是隐式的。当然,这不会造成混淆,因为if语句通常是一个表达式。