Scala: déballage de tuple dans la liste des arguments

je suis en train d'envoyer le résultat d'un appel de la méthode tuple partie de la liste des arguments pour une autre méthode.

méthode de la cible

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

Retour à partir de la méthode partielle de la liste d'arguments

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

En d'autres termes, je suis en train d'appeler printResult(String, (Int, Long, Long)). Si la signature de retour de méthode correspond à l'appel de méthode, alors j'aurais pu utiliser

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

il en résulte une syntaxe erreur

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

palliatif

je vais recourir à déballer manuellement le tuple, puis l'utiliser lors de l'appel de la méthode

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

y a-t-il une façon plus élégante de déballer et d'envoyer un tuple dans la liste d'arguments?

Références

Scala: la Décomposition de n-uplets dans les arguments de la fonction

Appeler une méthode à l'aide d'un tuple comme la liste des paramètres

tuple le déballage est-il directement pris en charge dans les listes de paramètres de Scala?

Tuple Déballage de la Carte des Opérations

10
demandé sur Community 2014-06-13 06:33:01

4 réponses

Vous pouvez effectuer les opérations suivantes:

val (result, startTime, endTime) = sendAndReceive(heartbeat)
printResult("Heartbeat only", result, startTime, endTime)
14
répondu Carl 2014-06-13 03:18:18

Êtes-vous attaché à cette fonction signature?

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

Si c'est votre code et vous pouvez la modifier, alors vous pouvez essayer et utiliser nourrissage à la place comme ceci:

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

alors vous pouvez l'exécuter comme ceci:

printResult("Curried functions!") _ tupled(sendAndReceive(heartbeat))
4
répondu kapunga 2014-06-13 03:51:21

Une approche implique des classes de cas pour le n-uplet, par exemple comme ceci,

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)
1
répondu elm 2014-06-13 03:19:47

cela peut effectivement être réalisé sans déballer le tuple en utilisant sans forme (et tupling la fonction comme vous l'avez fait):

import shapeless.syntax.std.tuple._

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

"Hi" +: sendAndReceive(???) ajoute la valeur "Hi" au tuple retourné par sendAndReceive.

1
répondu al3xar 2014-07-20 17:28:53