fun sum(a: Int, b: Int) = a + b
val x = 1.to(2)
我正在寻找:
sum.tupled(x)
或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)
答案 0 :(得分:1)
在了解了您的需求之后,我认为您根本不需要任何过载功能/扩展功能,只需使用KCallable#call,例如:
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)
答案 1 :(得分:1)
如果您想使用Kotlin的含糖语法,您也可以写下以下内容:
val sum : (Pair<Int,Int>) -> Int = { (a,b) -> a + b }
答案 2 :(得分:0)
扩展功能也是一种非常方便的方式:
fun Pair<Int, Int>.sum() = this.first + this.second
val x = 1.to(2)
x.sum()