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


() => 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") } } }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM