2009-06-17 18 views
54

mam łzawienie moje włosy próbuje dowiedzieć się, jak wykonać następujące czynności:Korzystanie varargs od Scala

def foo(msf: String, o: Any, os: Any*) = { 
    println(String.format(msf, o :: List(os:_*))) 
} 

Jest powód, dlaczego muszę zadeklarować metodę z o i osSeq oddzielnie. Zasadniczo kończę z metodą formatowania wywołaną z jednym parametrem obiektu (typu List). Próba:

def foo(msf: String, o: Any, os: Any*) = { 
    println(String.format(msf, (o :: List(os:_*))).toArray) 
} 

daje mi błąd typu:

found: Array[Any]

required Seq[java.lang.Object]

próbowałam casting, który kompiluje ale nie powiedzie się prawie z tego samego powodu, jak w pierwszym przykładzie. Kiedy próbuję

println(String.format(msg, (o :: List(os:_*)) :_*)) 

to nie skompilować z niejawnego dwuznaczności konwersji (any2ArrowAssoc i any2stringadd)

Odpowiedz

65
def foo(msf: String, o: AnyRef, os: AnyRef*) = 
    println(String.format(msf, (o :: os.toList).toArray : _*)) 
+0

To kompiluje ale przewraca się w czasie wykonywania: wyjątek w wątku "main" java.lang.ClassCastException. Scala $ okrężnicy $ okrężnicy nie mogą być oddane do scala.runtime.BoxedObjectArray \t w scala.runtime.RichString .format (RichString.scala: 242) –

+0

Również skąd pochodzi toList? –

+0

Naprawiono, działa teraz. Zgłaszam raport o błędzie - Scala nie powinna mieć zastrzeżeń ClassCastExceptions, z wyjątkiem sytuacji, gdy korzystasz z asInstanceOf. toList to metoda na Iterable [A] –

12
def foo(msf: String, o: AnyRef, os: AnyRef*) = 
    println(String.format(msf, o :: os.toList : _*)) 

lub

def foo(msf: String, o: AnyRef, os: AnyRef*) = 
     println(msf format (o :: os.toList : _*)) 

wolę to drugie, choć ma brak obsługi locale *.

  • Scala 2.8 ma obsługę regionalnych ustawień w formacie RichString.
+0

Korzystanie z metody formatu RichString jest tym, na co zdecydowałem się w końcu –