首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin:用Pair<Int调用( Int,Int) Pair<Int Int的惯用方法,Int>?

Kotlin:用Pair<Int调用( Int,Int) Pair<Int Int的惯用方法,Int>?
EN

Stack Overflow用户
提问于 2017-07-18 04:51:34
回答 3查看 1.2K关注 0票数 4
代码语言:javascript
复制
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)困住了

编辑

概括一下有用的答案,我认为这是目前最接近的事情:

代码语言:javascript
复制
fun <P1, P2, R> Function2<P1,P2,R>.tupled(x: Pair<P1, P2>): R = invoke(x.first, x.second)
EN

回答 3

Stack Overflow用户

发布于 2017-07-18 05:23:41

在了解了您的需求之后,我认为您根本不需要使用任何重载函数/扩展函数,只需使用KCallable#call,例如:

代码语言:javascript
复制
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,例如:

代码语言:javascript
复制
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),可以编写扩展函数,例如:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-07-18 05:28:42

如果您想使用Kotlin的糖类语法,也可以编写以下代码:

代码语言:javascript
复制
val sum : (Pair<Int,Int>) -> Int = { (a,b) -> a + b }
票数 1
EN

Stack Overflow用户

发布于 2017-07-18 05:27:54

扩展函数也是一种非常方便的方法:

代码语言:javascript
复制
fun Pair<Int, Int>.sum() = this.first + this.second
val x = 1.to(2)
x.sum()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45157737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档