有时我会看到大量的 Scala 代码,其中包含多个嵌套级别的条件和匹配,使用显式返回退出函数会更清晰。
避免那些显式的返回语句有什么好处吗?
Areturn
可以通过抛出异常来实现,因此它可能比声明方法结果的标准方式有一定的开销。(感谢 Kim Stebel 指出并非总是如此,甚至可能不是经常如此。)
此外,闭包上的 a 将从定义闭包return
的方法返回,而不仅仅是从闭包本身返回。这使得它既有用,又无用从闭包返回结果。
上面的一个例子:
def find[T](seq: Seq[T], predicate: T => Boolean): Option[T] = {
seq foreach { elem =>
if (predicate(elem)) return Some(elem) // returns from find
}
None
}
如果你还是不明白,那是实现并作为参数传递给的匿名对象的elem => if (predicate(elem)) return Some(elem)
方法。删除它,它不会工作。apply
Function1
foreach
return
一个缺点是无法推断返回类型。其他一切都是风格问题。对您来说似乎不清楚或令人困惑的事情对其他人来说可能是完全“自然的”。
显式返回会破坏控制流。例如,如果您有如下声明
if(isAuth(user)) {
return getProfile(user)
}
else {
return None
}
控制结构(如果)没有完成,这就是我认为它更令人困惑的原因。对我来说,这类似于一个 break 语句。此外,Scalas 的“一切都是价值”原则减少了使用显式返回的需要,从而减少了使用仅对 def 语句有用的关键字的人:
// start
def someString:String = return "somestring"
// def without return
def someString = "somestring"
// after refactoring
val someString = "somestring"
您会看到必须添加类型注释,并且在将 def 更改为 val 时需要删除返回。