2016-03-30 104 views
4

比方說,我有:爲科特林函數類型簽名使用默認參數

fun addInvoker(adder:() -> Int = ::add): Int{ 
    return adder() 
} 

fun add(num1:Int = 1, num2:Int = 1): Int{ 
    return num1 + num2 
} 

我得到一個錯誤,因爲::增加有兩個參數,但addInvoker的簽名要求它具有零個參數。但是,如果我將其更改爲:

fun addInvoker(adder: (Int, Int) -> Int = ::add): Int{ 
    return adder() 
} 

fun add(num1:Int = 1, num2:Int = 1): Int{ 
    return num1 + num2 
} 

然後我無法調用adder(),即使用其默認參數調用add。

那麼,有什麼辦法可以使::添加默認參數給invokeAdder,但仍然調用add與adder(),從而調用它與默認參數?

+0

試圖在加法器上創建零參數函數包裝器,我不知道是否在kotlin中有一些語法糖在另一個函數聲明中創建臨時匿名函數。就像'.... = ::(() - >(add()))):Int {.....' –

+0

對語言不瞭解,但通常情況下使包裝似乎解決您的問題。 – HuStmpHrrr

+0

是的,創建一個包裝的作品,但我想知道是否有一種方法,我可以用類型簽名做到這一點。我希望這是不可能的。 – pondermatic

回答

7

你可以製作一個你的add的lambda,它將是無參數函數,並且將使用默認參數{ add() }調用add

完整代碼:

fun addInvoker(adder:() -> Int = { add() }): Int { 
    return adder() 
} 

fun add(num1: Int = 1, num2: Int = 1): Int { 
    return num1 + num2 
} 

在科特林,使用默認參數的函數都在類型系統中沒有特別的表示,所以唯一的選擇就是讓包裝傳遞唯一的參數部分對他們說:

val add0:() -> Int = { add() } 
val add1: (Int) -> Int = { add(num1 = it) } 
val add2: (Int) -> Int = { add(num2 = it) }