fun sum(a: Int, b: Int) = a + b
val x = 1.to(2)
我正在寻找以下内容的翻译,与IT技术有关:
sum.tupled(x)
,或者sum(*x)
sum(x.first, x.second)
吗?
编辑:
综合有用的答案,我认为现在最接近的是:fun <P1, P2, R> Function2<P1,P2,R>.tupled(x: Pair<P1, P2>): R = invoke(x.first, x.second)
fun sum(a: Int, b: Int) = a + b
val x = 1.to(2)
sum.tupled(x)
,或者sum(*x)
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#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)
val sum : (Pair<Int,Int>) -> Int = { (a,b) -> a + b }
sum
不能用 2 个 Int
调用 :( - Abhijit Sarkar(Int, Int) -> Int
用作(Pair<Int, Int>) -> Int
。它们在内部工作方式上是不同的。 - SeaskywaysPair.component1()
和 Pair.component2()
来填充变量,这些变量看起来像参数,但实际上它们不是。 - Seaskyways扩展函数也是一种非常方便的方式:
fun Pair<Int, Int>.sum() = this.first + this.second
val x = 1.to(2)
x.sum()
multiply
和 subtract
呢?为每个函数都创建一个扩展函数太麻烦了。 - Abhijit Sarkar
intArray
中打错了,应该是IntArray
。但更重要的是sum(*IntArray(1, 2))
无法编译通过。第二个Int
与构造函数IntArray(size: Int, init: (Int) -> Int)
的init
函数冲突。 - Abhijit Sarkartupled
扩展函数吗?(我是 Kotlin 的新手)invoke
是在Function2
中定义的,对吧?所以你是将相同的数字加到自身上吗?这不会是我问题中的sum
。 - Abhijit Sarkar(T,T)->R
。 - holi-javasum(1,2)
,对吗?它需要两个Int
,对吗?请运行我的编辑后的答案,先生。 - holi-java