16

在 Groovy 中,return 语句是可选的,允许您编写如下方法:

def add(a, b) {
    a + b
}

...它将结果添加ab返回给调用者。

但是,我想知道当方法有多个返回“语句”时语义是什么。例如,在 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 是如何知道语句b内部if应该返回的呢?还是没有?我假设 Groovy 不能简单地将结果未使用的任何语句视为 a return,对吗?在这种情况下,“可选返回”功能的行为方式是否有任何明确定义的语义?

4

1 回答 1

29

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

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

因此,除非您明确返回它,否则永远不会返回b该块中的。if实际上,这意味着返回值将是评估的最后一条语句的结果,因此,如果您的示例是

def append(a, b) {
   if (!a) { b }
   else { a + b }
}

那么结果将是bif !aistruea + belse。

调用void函数的结果是null,所以如果示例是

def append(a,b) {
   if (!a) { b }
   else { a + b }
   println "debug: $a $b"
}

然后append总会回来null

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

于 2012-10-17T01:55:42.120 回答