2012-09-08 54 views
21

有时我会看到大量的Scala代码,带有几个嵌套级别的条件和匹配,使用显式返回从函数中退出会更清晰。是否有某些原因可以避免返回语句

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

+0

这是一篇关于[return](https://tpolecat.github.io/2014/05/09/return.html)的相关博客文章 – BlueSky

回答

17

return可以是通过抛出异常来实现,因此它可以具有优于声明一个方法的结果的标准方法一定开销。 (感谢金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,它不起作用。

+0

返回不总是使用异常实现。只需编译一个带有return语句的简单while循环,并使用javap -v查看输出。实际上,我希望看到任何以这种方式实现return _is_的示例。 –

+0

@KimStebel有趣的是,我不知道Scala优化了这种情况。举一个例子,看看我的答案中的代码。 –

+0

我确定要说的是,当你说clousure的返回将从它所定义的方法返回时,而不是从它的clousure返回。我已经烧了,就像你在这里解释的那样http://stackoverflow.com/questions/11929485/scala-problems-with-return-statement – opensas

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

相关问题