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

猜你喜欢

转载自my.oschina.net/u/2963604/blog/1805445