Scala—scala中不建议使用return

在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也专门为递归做了优化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值