1. 程式人生 > >Scala中 => Unit 與 () =>Unit的區別

Scala中 => Unit 與 () =>Unit的區別

def eval 所有 cal col nbsp args 最後一行 方法體

() => Unit ---> 是一個函數;
=> Unit --> 是一個執行結果為Unit的表達式

code: => Unitby 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被打印在了startend中間。

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的區別