scala中return

scala> def f(x:Int) = return x+1 //不能推断返回类型,所以必须要显式说明返回类型才不会出错
<console>:11: error: method f has return statement; needs result type
       def f(x:Int) = return x+1
                      ^

scala> def f(x:Int):Int = return x+1
f: (x: Int)Int

scala> def f2(x:Int) = x+1
f2: (x: Int)Int

下面代码还不是很明白(主要是对foldLeft不理解)

scala> def add(n:Int,m:Int):Int = return n+m
add: (n: Int, m: Int)Int

scala> def sum1(ns:Int*):Int = ns.foldLeft(0)((n,m)=> return n+m)
sum1: (ns: Int*)Int

scala> println(sum1(1,2,3))         //式1.1
1  //这个结果真的是不明白????

scala> def sum2(ns:Int*):Int = ns.foldLeft(0)(add)
sum2: (ns: Int*)Int

scala> println(sum2(1,2,3))         //式1.2
6

上面代码中,需要先搞清楚foldLeft函数,下面做点实验:

scala> val numbers = List(5,4,8,6,2)
numbers: List[Int] = List(5, 4, 8, 6, 2)

scala> numbers.fold(0){(z,i)=>z+i}
res11: Int = 25
为什么会打印出来结果为25呢?

    val numbers = List(5,4,8,6,2)
    println(numbers.foldLeft(0){(z,i)=>z+i})
    println(numbers.foldLeft(1){(z,i)=>z+i})
    println(numbers.foldLeft(2){(z,i)=>z+i})

打印出来的结果为:

25
26
27

这又是为什么呢?看下面scala中源代码可以知道Z其实是初始总值,中途相加时Z又是和值。所以打印出来的结果是25,26,27.

在scala.collection.TraversableOnce中

  def foldLeft[B](z: B)(op: (B, A) => B): B = {
    var result = z
    this foreach (x => result = op(result, x))
    result
  }

再回头来看式1.1

也就是说在foldLeft函数中result=0,x=1时相加,然后返回1,此时遇到return n+m指令了,而scala中return将会退出整个函数,所以返回结果为1。而式1.2因为只是函数add return了,并不是foldLeft中的匿名函数中被return了,所以结果为6

转载于:https://my.oschina.net/u/2963604/blog/1805445

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值