2010-09-16 6 views
6

Ho una lista di tipo [T] e [B] in scala, con un oggetto e di tipo E.Modifica più liste all'interno di una funzione e il ritorno a Scala

Voglio fare una funzione che accetta questi tre parametri:

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

Tuttavia mi rendo conto che List è immutabile, e tutto passato a una funzione è considerato come val (non var). Ma ho bisogno di modificare t e b e restituire le modifiche al chiamante della funzione. Qualcuno ha qualche idea su come farlo?

non posso andare e modificare l'elenco di serie ... Perché ho usato ovunque e il file è così grande ..

risposta

15

È necessario modificare t e b in modo funzionale con maggiore ordinare funzioni come map, filter, ... e inserire il risultato di esse in nuovi val s (ad es. modifiedT, modifiedB). Quindi è possibile utilizzare un Tuple2 per restituire 2 valori dal metodo.

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]] 
} 

Nel metodo chiamante è possibile assegnare i valori in questo modo:

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

Ovviamente dipende da cosa si intende con "modifica". Se questa modifica è complicata, si dovrebbe considerare l'utilizzo di view per rendere il calcolo pigro per spostare il tempo di calcolo in un momento successivo.

+3

Avete bisogno di un '=' tra 'e: E)' e '{' se avete intenzione di restituire qualcosa. –

+0

Sei corretto Rex, grazie. Non so quante volte dimentico questo piccolo '=' in Scala ... –

+0

Grazie, funziona davvero bene michael! –

Problemi correlati