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?
4 réponses
Vous pouvez effectuer les opérations suivantes:
val (result, startTime, endTime) = sendAndReceive(heartbeat)
printResult("Heartbeat only", result, startTime, endTime)
Ê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))
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)
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
.