Groovy';s";“可选返回”;语义学
在Groovy中,允许您编写以下方法: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) {
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语句通常是一个表达式。