2016-03-30 8 views
4

Lassen Sie uns sagen, ich habe:Art Signatur für Kotlin Funktion mit Standardparametern

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

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

Ich erhalte eine Fehlermeldung, da :: add zwei Parameter hat, aber die Unterschrift von addInvoker erfordert es Null-Parameter haben. Allerdings, wenn ich es zu ändern:

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

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

Dann kann ich nicht Addierer() aufrufen, das heißt mit seiner Standardargumente Berufung auf hinzufügen.

Also, gibt es eine Möglichkeit, wie ich :: das Standardargument zu invokeAdder hinzufügen, aber immer noch add mit adder() aufrufen kann, wodurch es mit den Standard-Argumenten aufgerufen wird?

+0

versuchen, Zero-Parameter Funktion Wrapper über Addierer, ich weiß nicht, ob Sie gibt es einige syntaktische Zucker in Kotlin Ad-hoc-anonyme Funktionen innerhalb einer anderen Funktionsdeklaration zu erstellen. Etwas wie '.... = :: (() -> (add()))): Int {.....' –

+0

keine Ahnung von der Sprache, aber im Allgemeinen scheint Wrapper dein Problem zu lösen. – HuStmpHrrr

+0

Yup, das Erstellen eines Wrappers funktioniert, aber ich frage mich, ob es eine Möglichkeit gibt, dies mit Typ-Signaturen zu tun. Ich erwarte, dass es nicht möglich ist. – pondermatic

Antwort

7

Sie können ein Lambda von add erstellen, das keine Argumentfunktion ist und add mit seinen Standardargumenten aufrufen wird: { add() }.

kompletter Code:

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

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

In Kotlin, Funktionen mit Standardargumenten haben keine besondere Darstellung im Typsystem, so dass die einzige Möglichkeit ist, nur ein Teil der Argumente ihnen vorbei Wrapper zu machen:

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