2009-06-17 16 views
54

estoy rasgando mi pelo a cabo tratando de encontrar la manera de hacer lo siguiente:Uso varargs de Scala

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

Hay una razón por la que tengo que declarar el método con un o y un osSeq por separado. Básicamente, termino con el método de formato llamado con un solo parámetro de objeto (del tipo List). Intentando:

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

me da el error de tipo: de fundición

found: Array[Any]

required Seq[java.lang.Object]

He tratado, que compila pero falla por más o menos la misma razón que el primer ejemplo. Cuando intento

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

esta falla al compilar con la ambigüedad implícita de conversión (any2ArrowAssoc y any2stringadd)

Respuesta

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

Se compila pero se cae en tiempo de ejecución: Excepción en el hilo "principal" java.lang.ClassCastException:. $ $ De colon de colon Scala no puede ser echado a scala.runtime.BoxedObjectArray \t en scala.runtime.RichString .format (RichString.scala: 242) –

+0

Además, ¿de dónde viene theList? –

+0

Solucionado, funciona ahora. Estoy presentando un informe de error: Scala no debería tener ClassCastExceptions, excepto cuando haya utilizado comoInstanceOf. toList es un método en Iterable [A] –

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

o

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

me gusta mucho más este último, a pesar de que tiene sin configuración local * soporte.

  • Scala 2.8 tiene soporte de configuración regional con el formato de RichString.
+0

Uso del método de formato RichString es lo que opté al final –

Cuestiones relacionadas