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