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 に答える
1

これは実際、shapeless を使用してタプルをアンパックしなくても実現できます(そして、行ったように関数をタプルします):

import shapeless.syntax.std.tuple._

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

"Hi" +: sendAndReceive(???)"Hi"によって返されるタプルに値を追加するだけsendAndReceiveです。

于 2014-07-20T17:28:53.517 に答える
1

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 に答える