Scala中 => Unit 與 () =>Unit的區別
阿新 • • 發佈:2019-01-23
def eval 所有 cal col nbsp args 最後一行 方法體
() => 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")
}
}
}
Scala中 => Unit 與 () =>Unit的區別