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

相關文章
相關標籤/搜索