2010-09-16 18 views
6

Mam Lista typu [T] i [B] w Scala, z obiektem e typu E.Modyfikacja wielu list wewnątrz funkcji i odsyłając go w Scala

chcę zrobić funkcję, która przyjmuje te trzy parametry:

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

jednak zdaję sobie sprawę, że lista jest niezmienna, a wszystko przekazany do funkcji jest uważany za val (nie var). Ale muszę zmodyfikować tib i zwrócić modyfikacje z powrotem do wywołującego funkcję. Czy ktoś ma jakiś pomysł, jak to zrobić?

nie mogę iść i zmienić listę na tablicy ... Ponieważ używam go wszędzie, a plik jest tak duża ..

Odpowiedz

15

Należy zmodyfikować t i b w sposób funkcjonalny z wykorzystaniem wyżej porządkuj funkcje, takie jak map, filter, ... i umieść ich wynik w nowych val s (np. modifiedT, modifiedB). Następnie możesz użyć parametru Tuple2, aby zwrócić 2 wartości z metody.

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

W metodzie wywołującego można następnie przypisać wartości w ten sposób:

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

Oczywiście to zależy co masz na myśli z „zmodyfikować”. Jeśli ta modyfikacja jest skomplikowana, powinieneś rozważyć użycie view, aby leniwy obliczenia przesunąć czas obliczeń na późniejszy czas.

+3

Potrzebujesz '=' między 'e: E)' a '{' jeśli chcesz coś zwrócić. –

+0

Masz rację Rex, dziękuję. Nie wiem, jak często zapominam o tym małym '=' w Scali ... –

+0

Dziękuję, działa naprawdę dobrze Michael! –