Scala:解压缩元组作为参数列表的一部分

Han*_*xue 13 scala tuples arity iterable-unpacking

我试图发送方法调用的元组的结果,作为另一个方法的参数列表的一部分.

目标方法

def printResult(title: String, result: Int, startTime: Long, endTime: Long)
Run Code Online (Sandbox Code Playgroud)

从方法,部分参数列表返回

def sendAndReceive(send: Array[Byte]): (Int, Long, Long)
Run Code Online (Sandbox Code Playgroud)

换句话说,我试着打电话printResult(String, (Int, Long, Long)).如果方法返回签名与方法调用匹配,那么我可以使用

(printResult _).tupled(sendAndReceive(heartbeat))
Run Code Online (Sandbox Code Playgroud)

这会导致语法错误

printresult("Hi", Function.tupled(sendAndReceive(heartbeat))
Run Code Online (Sandbox Code Playgroud)

解决方法

我正在手动解压缩元组,然后在调用方法时使用它

val tuple = sendAndReceive(heartbeat)
printResult("Heartbeat only", tuple._1, tuple._2, tuple._3)
Run Code Online (Sandbox Code Playgroud)

是否有一种更优雅的方式来解压缩并将元组作为参数列表的一部分发送?

参考

Scala:在函数参数中分解元组

使用元组作为参数列表调用方法

在Scala中的参数列表中是否会直接支持元组解包?

元组在地图操作中解包

Car*_*arl 17

您可以执行以下操作:

val (result, startTime, endTime) = sendAndReceive(heartbeat)
printResult("Heartbeat only", result, startTime, endTime)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我同意这是有效的.但是我可以在不解开元组的情况下完成吗? (4认同)

kap*_*nga 5

你附上这个函数签名吗?

def printResult(title: String, result: Int, startTime: Long, endTime: Long)
Run Code Online (Sandbox Code Playgroud)

如果这是您的代码并且您可以修改它,那么您可以尝试使用柯里化来代替,如下所示:

def printResult(title: String)(result: Int, startTime: Long, endTime: Long)
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样执行它:

printResult("Curried functions!") _ tupled(sendAndReceive(heartbeat))
Run Code Online (Sandbox Code Playgroud)