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)Intthis

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

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

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

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  //这个结果然的是不明白????foreach

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

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

上面代码中,须要先搞清楚foldLeft函数,下面作点实验:error

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

相关文章
相关标签/搜索