在scala中使用return的话,编译的时候会提示
the latest statement is method is automatically returned, use of th return keyword is redundant.
这个警告是说最后一个语句的结果会自动返回,使用return关键字是多余的。
在查阅之后,整理了以下几点不建议使用return关键字的原因
要写函数而不是指令
函数式编程的一个重要理念就是尽量使代码由无状态的函数构成,而不是给计算机发出指令。
简单地讲,函数式编程差不多追求的就是代码块[函数]写得和数学表示差不多,这样才清晰,比如数学中:
f(x) = x + 1
对应的Scala代码为:
def f(x:Int) = x + 1
def f(x:Int):Int = return x + 1
从Scala两个写法中分别使用和不使用return地表达式来看,除了def关键字和对参数地类型标记外,不使用return看起来就是函数,而使用了return更像指令
使用return会影响类型推断
Scala中的类型推断机制会自动将最后一个表达式的类型作为返回类型,函数能自动识别结果为某类型。
如果使用了return语句,就会破坏类型推断机制,需要显示注明返回类型。
使用return返回含义模糊
有时使用return会让代码的返回更加混乱,这个歧义主要产生于return到底返回到哪一层函数
def add(n:Int,m:Int):Int = return n+m
def sum1(ns:Int*):Int = ns.foldLeft(0)(add)
上述代码中,目前来看还没什么问题,但是写成下面的形式
def sum2(ns:Int*):Int = ns.foldLeft(0)((n,m) => return n+m)
直观感受,上面两种写法是一致的,但事实上sum1(1,2,3) = 6,sum2(1,2,3) = 1
原因就是return语句会直接让它出现的函数返回,也就会直接break foldLeft的循环返回结果
再看另一个例子:
def foo:Int = {
val sumR:List[Int] => Int = _.foldLeft(0)((n,m) => return n + m)
sumR(List(1,2,3)) + sumR(List(4,5,6))
}
首先定义一个匿名函数,在调用匿名函数的时候,相当于return语句出现在了foo函数中,因此foo() = 1
这里可以提到一个点,anonymous function中的return
scala是用抛出异常的方式来实现anonymous func中的return的,anonymous function中的return是以NonLocalReturnException实现的
关于anonymous function中的return具体的解释如下网站:
https://www.jianshu.com/p/2053634328d3
处理方法
实际开发中我们会经常遇到貌似必须使用return的时候
首先,scala既然提供了return关键字,说明并不是禁止使用的,而是需要考虑是否必须这么做。在Scala认为,所有的需要使用return来break的循环,都是可以通过转化为递归来替代的,并且性能方面Scala也专门为递归做了优化。