22

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

避免那些显式的返回语句有什么好处吗?

4

3 回答 3

18

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)方法。删除它,它不会工作。applyFunction1foreachreturn

于 2012-09-09T01:01:10.963 回答
2

一个缺点是无法推断返回类型。其他一切都是风格问题。对您来说似乎不清楚或令人困惑的事情对其他人来说可能是完全“自然的”。

于 2012-09-08T21:18:57.493 回答
2

显式返回会破坏控制流。例如,如果您有如下声明

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

于 2012-09-08T22:29:47.360 回答