def test1 = { // 1. without () println("SS") } def test2() = { //2. with () println("GG") } test1()
第一種寫法,沒有 () 。使用時,不可以加上 () 否則會出錯。因此呼叫時只有一種寫法,test1。
第二種寫法,有 () 。使用時,可以加上 (),也可以不要加上 () 。因此呼叫時有兩種寫法, test2 或 test2()。
如果要把 function 當成變數在傳遞時,
第一種寫法,只能寫成 val a = test1 _ 。
第二種寫法,可以寫成 val a = test2 _ 或是 val a: () => Unit = test2
假設現在有一個變數定義為 val a = test2 _ 。
那麼 val b = a 的意思為 b 和 a 的型別一樣,內容指向 test2
而 val b = a() 的意思為執行 test2() ,並將回傳值放在變數 b
這裡出現了一個很奇怪的現象,test2 沒加 () 表示執行該 function。可是對於函數變數(如 a),你沒加 () 表示你沒有要執行該 function。
對於不接受參數的函數定義,建議使用第一種寫法(沒加上 ()) 以免產生渾亂。 scala api 對於不接受參數的函數定義都以不加上 () 為主。
沒有留言:
張貼留言