2016-03-09 10 views
6

Kotlin supporta dichiarazioni destrutturazione:È possibile utilizzare la destrutturazione in argomenti di funzione?

val (a, b) = Pair(1,2) 

Questo è simile al disimballaggio iterabile di Python:

a, b = (1, 2) 

Python ha anche un operatore splat/spread che consente di eseguire un'operazione simile con gli argomenti della funzione:

def f(a, b): pass 
pair = (1,2) 
f(*pair) 

Il kotlin ha una capacità simile? Ovviamente, è possibile decomprimere la struttura manualmente:

f(pair.component1(), pair.component2()) 

Ma questo è goffo. C'è un modo per farlo in modo più elegante? Non vedo nulla nel docs on the subject.

risposta

9

No, questo è possibile solo per gli array e vararg-funzioni

val foo = arrayOf(1, 2, 3) 
val bar = arrayOf(0, *foo, 4) 
+0

che è troppo male. Strano che l'operatore di spread esista in modo così limitato. –

0

È possibile definire una funzione di estensione per distribuire gli argomenti dello Pair. Come questo:

fun <A, B, R> Pair<A, B>.spread(f: (A, B) -> R) = f(first, second) 

fun add(a: Int, b: Int) = a + b 

fun main(args: Array<String>) { 
    println(Pair(1, 2).spread(::add)) 
} 

Questo stampa 3.

Problemi correlati