2011-12-01 8 views
5

Rozważmy takie metody:Jak przekazywać argumenty variadyczne podczas dodawania kolejnego w Scali?

def clearlnOut(coll : Any*) 
{ 
    clearOut(coll:_*,"\n") // error 
} 
def clearOut(coll : Any*) 
{ 
    ... 

Kompilator mówi:

error: no `: _*' annotation allowed here (such annotations are only allowed in arguments to *-parameters)

Teraz jestem zdziwiony. Jasne jest, jak używać argumentów variadycznych, jak poprawnie przekazać taką zwiększoną "kolekcję"?

+0

zasługuje to a/r/lolscala subreddit. –

Odpowiedz

6

Spróbuj tego:

def clearlnOut(coll : Any*) { 
    clearOut(coll ++ "\n") 
} 

UPDATE: znacznie lepszą wersję zaproponowaną przez @Rex Kerr (patrz komentarz poniżej):

def clearlnOut(coll : Any*) { 
    clearOut((coll :+ "\n"): _*) 
} 
+0

Fajnie, dziękuję. Myślałem, że argumenty variadyczne (po przejściu) muszą zostać rozwinięte. – greenoldman

+4

Czy naprawdę chcesz '++'? To doda '\ n' jako znak (i ​​doda" foo "jako trzy oddzielne elementy jednego znaku). Wydaje się, że ': +' jest drogą do zrobienia. Ponadto, nie chcesz do niego dołączyć ': _ * '? W przeciwnym razie otrzymasz 'Seq [Seq [Any]]', dodatkowy poziom zagnieżdżania. –

+0

@RexKerr: Dziękuję za sugestie, masz absolutną rację. Dodałem twoje rozwiązanie do mojej odpowiedzi, jednak powinieneś prawdopodobnie dodać osobną odpowiedź, aby dać ci pełny kredyt. –

Powiązane problemy