有时候我会看到大量的Scala代码,有几个嵌套的条件和匹配级别,使用显式返回退出函数会更清楚。
避免那些明确的退货声明有什么好处吗?
答案 0 :(得分:18)
return
可以通过抛出异常来实现,因此可能在声明方法结果的标准方式上具有某种开销。 (感谢Kim Stebel指出这并非总是如此,甚至可能不经常发生。)
此外,闭包上的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
,它将无效。
答案 1 :(得分:2)
一个缺点是无法推断返回类型。其他一切都是风格问题。对你来说似乎不清楚或混淆的东西对其他人来说可能是完全“自然”的。
答案 2 :(得分:2)
显式返回会中断控制流。例如,如果您有类似
的声明if(isAuth(user)) {
return getProfile(user)
}
else {
return None
}
控制结构(如果)没有完成,这就是为什么我认为它更令人困惑的原因。对我来说,这类似于休息陈述。此外,Scalas的“一切都是值”原则减少了使用显式返回的需要,这导致使用仅对def语句有用的关键字的人越少:
// start
def someString:String = return "somestring"
// def without return
def someString = "somestring"
// after refactoring
val someString = "somestring"
您会看到必须添加类型注释,并且在将def更改为val时,需要删除返回。