【问题标题】:Groovy's "optional return" semanticsGroovy 的“可选返回”语义
【发布时间】:2012-10-07 04:52:24
【问题描述】:

在 Groovy 中,return statement is optional,允许您编写如下方法:

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 怎么知道应该返回 if 语句中的 b?还是没有?我假设 Groovy 不能简单地将结果未使用的任何语句视为 return,对吗?在这种情况下,“可选返回”功能的行为是否有任何明确定义的语义?

【问题讨论】:

    标签: groovy return


    【解决方案1】:

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

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

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

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

    如果!atrue,则结果将为b,否则为a + b

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

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

    那么append 将始终返回null

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

    【讨论】:

    • 有道理。虽然如果我做了else { a + b } 怎么办?在这种情况下,b 将位于方法的“末尾”,因为它后面没有可执行语句。
    • 我添加了几个额外的示例来详细说明可选返回语义在实践中的含义。
    • 我的经验法则是在方法中使用 return 而不是在闭包中打扰,但是我是一个老程序员,我的眼睛希望看到所有显式返回(监护子句、提前退出和最终结果)。这也有助于我的闭包倾向于简单的内联类型,其中增加了简洁性。
    • 最后一个被计算的表达式被隐式返回。事实上,这是另一个(有时)被误解的 groovy 功能​​趋势。在几种函数式语言中,return 语句总是隐含的。当然,这不会造成混淆,因为 if 语句通常是一个表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 2010-12-28
    相关资源
    最近更新 更多