Kotlin:调用方式(Int,Int) – > Int与一对<Int,Int>?

fun sum(a: Int, b: Int) = a + b val x = 1.to(2) 

我在找:

  1. sum.tupled(x)
  2. sum(*x)

当然,以上都没有与Kotlin 1.1.3-2编译。 所以我坚持sum(x.first, x.second)

编辑

总结有用的答案,我认为这是目前最接近的事情:

 fun <P1, P2, R> Function2<P1,P2,R>.tupled(x: Pair<P1, P2>): R = invoke(x.first, x.second) 

知道了你的需求之后,我想你根本不需要任何重载功能/扩展功能,只需要使用KCallable#调用 ,例如:

 val x = arrayOf(1, 2) // v--- top-level functions val result:Int = ::sum.call(*x) // v--- member-level functions val result:Int = this::sum.call(*x) 

您也可以像Java那样在Kotlin中重载函数sum ,例如:

 sum(1 to 2) sum(*intArrayOf(1, 2)) fun sum(tuple: Pair<Int, Int>) = sum(tuple.first, tuple.second) fun sum(vararg pair: Int) = sum(pair[0], pair[1]) 

对于sum.tupled(x)你可以写一个扩展函数,例如:

 val sum: (Int, Int) -> Int = ::sum // top-level function //OR val sum:(Int, Int)->Int = this::sum // member scope function // the final form is what you want // v val result:Int = sum.tupled(1 to 2) fun <T1,T2,R> Function2<T1,T2,R>.tupled(x:Pair<T1,T2>):R = invoke(x.first,x.second) 

你也可以如果你想使用Kotlin的含糖语法,写下面的内容:

 val sum : (Pair<Int,Int>) -> Int = { (a,b) -> a + b } 

扩展功能也是一个非常方便的方法:

 fun Pair<Int, Int>.sum() = this.first + this.second val x = 1.to(2) x.sum()