2011-12-20 14 views

risposta

31

è possibile restituire una tupla:

def blarg = ("blargidy", "blarg") 

val (i, j) = blarg 

Nota la sintassi pattern-matching per l'assegnazione variabili in parallelo: questo funziona per qualsiasi motivo, non solo per le tuple. Quindi, ad esempio:

val list = 1 :: 2 :: 3 :: Nil 

val x :: y = list // x = 1 and y = 2 :: 3 :: Nil 
+0

Impressionante, grazie! – dave

+3

Questo è in realtà proprio come funziona in Python. –

+1

@KarlKnechtel, solo se il numero di elementi restituiti corrisponde al numero di variabili. Altrimenti si ottiene l'errore "troppi valori da decomprimere", che è ciò che si otterrebbe in Python nel secondo esempio. – dave

6

Mi rendo conto che questa è una domanda vecchia, ma c'è un altro modo per ottenere lo stesso. Non so se c'è qualche svantaggio, ma il vantaggio è che i valori restituiti sono "nominati", rendendo il codice un po 'più auto-esplicativo.

(testato su scala 2,11)

package test.scala.misc 

object TestReturnMultipleNamedValues extends App { 

    val s = getMultipleNamedValues 

    println(s"changed=${s.dsChanged} level=${s.dsLevel}") 

    /** Returns an anonymous structure with named members. 
    * */ 
    def getMultipleNamedValues() : {val dsChanged : Boolean;val dsLevel : Int} = { 
     new { 
      val dsChanged = true 
      val dsLevel = 1 
     } 
    } 
} 
+1

Oppure utilizzare una classe case in modo che l'abbinamento di modelli funzioni –