() => Unit
---> 是一個函數;=> Unit
--> 是一個執行結果為Unit的表達式
code: => Unit
是 by name
傳遞參數。參數是一個返回值為Unit
的代碼塊。在傳遞的時候,參數沒有被調用。比如:
def test(code : => Unit){ println("start") code // 這行才會調用傳入的代碼塊,寫成code()亦可
println("end") } test{// 此處的代碼塊不會馬上被調用
println("when evaluated") println("bb") }
結果
start
when evaluated
bb
end
注意:when evaluated
被打印在了start
和end
中間。
而code: ()=>Unit
參數的類型,是一個沒有參數而且返回值為Unit的函數類型。
def test1(code: ()=>Unit){ println("start") code() // 要想調用傳入的代碼塊,必須寫成code(),否則不會調用。
println("end") } test1 {//此代碼塊,傳入后立即執行。
println("when evaluated") ()=>{println("bb")} }
結果:
when evaluated
start
bb
end
注意:when evaluated
被打印在了start
之前。
實際上,在第二例當中,test1
的參數是一個表達式。在Scala中,如果將要傳入的參數正好是一個,則可以用花括號。這時候test1
的參數列表是一個表達式,而這個表達式的結果是最后一行的返回,也就是一個函數() => { println("bb") }
,它被傳給了test1
的唯一參數。然后test1
方法體執行。至於為什么when evaluated
在另外三行之前,是因為它是在傳參的時候,求表達式值的副產物。
其實code :=> Unit
就是code : () => Unit
,只是第一種是按名
傳參,用花括號
可以把花括號內的所有東西作為一個函數傳給code
;第二種就是普通傳參
,但是它剛好只有一個參數
。這時候用了花括號
,就是花括號內表達式的值傳進去了。
最后,提供對等用例
object FunctionTest2 { def main(args: Array[String]) { def test(code: => Unit) { println("start") code println("end") } test { println("when evaluated") println("bb") } def test1(code: () => Unit) { println("start") code() println("end") } test1 { () => println("when evaluated") println("bb") } } }