15

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

目标方法

def printResult(title: String, result: Int, startTime: Long, endTime: Long)

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

def sendAndReceive(send: Array[Byte]): (Int, Long, Long)

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

(printResult _).tupled(sendAndReceive(heartbeat))

这会导致语法错误

printresult("Hi", Function.tupled(sendAndReceive(heartbeat))

解决方法

我正在求助于手动解包元组,然后在调用方法时使用它

val tuple = sendAndReceive(heartbeat)
printResult("Heartbeat only", tuple._1, tuple._2, tuple._3)

有没有更优雅的方式来解包和发送元组作为参数列表的一部分?

参考

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

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

Scala 的参数列表会直接支持元组解包吗?

地图操作中的元组解包

4

4 回答 4

22

您可以执行以下操作:

val (result, startTime, endTime) = sendAndReceive(heartbeat)
printResult("Heartbeat only", result, startTime, endTime)
于 2014-06-13T03:18:18.500 回答
5

您是否附加到此函数签名?

def printResult(title: String, result: Int, startTime: Long, endTime: Long)

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

def printResult(title: String)(result: Int, startTime: Long, endTime: Long)

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

printResult("Curried functions!") _ tupled(sendAndReceive(heartbeat))
于 2014-06-13T03:51:21.353 回答
1

一种方法涉及元组的案例类,例如像这样,

case class Result(result: Int, startTime: Long, endTime: Long) {
  override def toString() = s"$result ($startTime to $endTime)"
}

def sendAndReceive(send: Array[Byte]): Result = {
  // body
  Result(1,2,3)
}

def printResult(title: String, res: Result) = println(title + res)
于 2014-06-13T03:19:47.043 回答
1

这确实可以在不使用 shapeless 解包元组的情况下实现并像你一样对函数进行元组):

import shapeless.syntax.std.tuple._

(printResult _).tupled("Hi" +: sendAndReceive(???))

"Hi" +: sendAndReceive(???)只是将值"Hi"添加到返回的元组中sendAndReceive

于 2014-07-20T17:28:53.517 回答