2014-09-12 11 views
13

Mam na przykład funkcję o nazwie or, która jest zdefiniowana jako;Przekazywanie elementów listy jako parametrów do funkcji o zmiennych argumentach

or(filters: FilterDefinition*) 

A potem mam listę:

List(X, Y, Z) 

Co teraz trzeba zrobić, to zadzwonić or jak

or(func(X), func(Y), func(Z)) 

i zgodnie z oczekiwaniami długość listy mogą ulec zmianie.

Jaki jest najlepszy sposób na zrobienie tego w Scali?

+3

To nie jest dokładnie to samo pytanie, ale zawiera notację ": _ *", która jest kluczem do odpowiedzi (zakładając, że możesz po prostu 'list.map (func)'!): Http://stackoverflow.com/questions/ 1008783 –

+0

Jeśli przekazujemy całą listę elementów i przetwarzamy je wszystkie w wywołanym funkc można to zrobić, po prostu przekazując listę do funkcji i funkcja może iterować przez elementy, bez potrzeby specjalnej składni: _ *, prawda? Czy mogę się mylić, czy istnieje jakiś dobry powód takiego użycia? – user3366706

+0

@ user3366706 byłoby bardziej tradycyjne podejście do rzeczy, tak. U mnie było to niezwykle przydatne w przypadku DSL, który oczekiwał wygenerowanego zapytania jako argumentu funkcji - ze zmienną liczbą argumentów. – Ashesh

Odpowiedz

32

Spójrz na ten przykład, będę określić PrintMe funkcję, która pobiera vargs typu String

def printme(s: String*) = s.foreach(println) 


scala> printme(List("a","b","c")) 

<console>:9: error: type mismatch; 
found : List[String] 
required: String 
       printme(List(a,b,c)) 

Co naprawdę trzeba un-pack listy do argumentów z operatorem

scala> val mylist = List("1","2","3") 
scala> printme(mylist:_*) 
1 
2 
3 
:_*
+0

Działa również z klasą: 'case case PrzykładClass (d: Double *) –

Powiązane problemy