Esiste un modo per manipolare più valori di una tupla senza utilizzare una variabile temporanea e iniziare una nuova istruzione?Manipolazione delle tuple
Dire che ho un metodo che restituisce una tupla e voglio fare qualcosa con quei valori in linea.
ad es. se voglio dividere una stringa ad un certo punto e invertire i pezzi
def backToFront(s: String, n:Int) = s.splitAt(n)...
posso fare
val (a, b) = s.splitAt(n)
b + a
(richiede variabili temporanee e nuova dichiarazione) o
List(s.splitAt(n)).map(i => i._2 + i._1).head
(opere , ma sembra un po 'sporco, creando un singolo elemento Elenco solo per questo) o
s.splitAt(n).swap.productIterator.mkString
(funziona per questo particolare esempio, ma solo perché esiste un metodo swap
che fa ciò che voglio, quindi non è molto generale).
Il metodo zipped
su tuple sembra essere solo per le tuple delle liste.
Come un altro esempio, come è possibile trasformare la tupla ('a, 'b, 'c)
in ('b, 'a, 'c)
in un'unica istruzione?
L'abbinamento di modelli è buono! 's.splitAt (n) match {case (a, b) => b + a}' funziona per la prima parte –
È un peccato che non ci sia un metodo 'fold' nella libreria standard; allora potresti semplicemente 's.splitAt (n) .fold ((a, b) => b + a)', e sarebbe anche più efficiente. (Sì, certo che l'ho creato da solo.) –
Fold è un buon nome per questo. Ho aggiornato la mia risposta. –