2010-09-16 11 views
6

Rückkehr habe ich eine Liste des Typs [T] und [B] in scala, mit einem Objekt e vom Typ E.mehr Listen innerhalb einer Funktion ändern und es in Scala

ich eine Funktion machen will, die akzeptiert diese drei Parameter:

def doSomething(t : List[T], b List[B], e : E) { 
... } 

Allerdings merke ich, dass Liste unveränderlich ist, und alles, was auf eine Funktion übergeben wird als val (nicht var) betrachtet. Aber ich muss t und b ändern und die Änderungen zurück an den Aufrufer der Funktion zurückgeben. Hat jemand eine Idee, wie man das macht?

Ich kann nicht die Liste Array gehen und ändern ..., weil ich habe es überall verwenden und die Datei ist so groß ..

Antwort

15

Sie t und b in einer funktionalen Weise verändern sollten höher verwenden Funktionen wie map, filter, ... bestellen und das Ergebnis in neue val s setzen (zB modifiedT, modifiedB). Dann können Sie Tuple2 verwenden, um 2 Werte aus der Methode zurückzugeben.

def doSomething(t: List[T], b: List[B], e: E) = { 
    // somehting you want to do 
    val modifiedT = t.map(...).filter(...) 
    val modifiedB = b.map(...).filter(...) 
    (modifiedT, modifiedB) // returns a Tuple2[List[T], List[B]] 
} 

Im Rufmethode können Sie dann die Werte auf diese Weise vergeben:

val (t2, b2) = doSomething(t, b, e) 

Natürlich ist es hängt davon ab, was mit Ihnen bedeuten „ändern“. Wenn diese Änderung kompliziert ist, sollten Sie die Verwendung von view in Erwägung ziehen, um die Berechnung zu verzögern, um die Berechnungszeit auf einen späteren Zeitpunkt zu verschieben.

+3

Sie brauchen ein '=' zwischen 'e: E)' und '{' wenn Sie etwas zurückgeben wollen. –

+0

Sie sind richtig Rex, danke. Ich weiß nicht, wie oft ich dieses kleine '=' in Scala vergesse ... –

+0

Danke, es klappt wirklich gut Michael! –

Verwandte Themen