是否有理由避免退货声明

时间:2012-09-08 21:04:39

标签: scala conditional return

有时候我会看到大量的Scala代码,有几个嵌套的条件和匹配级别,使用显式返回退出函数会更清楚。

避免那些明确的退货声明有什么好处吗?

3 个答案:

答案 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时,需要删除返回。