2009-06-17 8 views
54

Je suis déchirer mes cheveux à essayer de comprendre comment effectuer les opérations suivantes:Utilisation varargs de Scala

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

Il y a une raison pour laquelle je dois déclarer avec un o et un osSeq séparément. Fondamentalement, je me retrouve avec la méthode de format appelée avec un seul paramètre d'objet (de type List). Tentative:

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

me donne l'erreur de type:

found: Array[Any]

required Seq[java.lang.Object]

J'ai essayé casting, qui compile mais échoue pour à peu près la même raison que le premier exemple. Lorsque je tente

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

ce ne parvient pas à compiler avec l'ambiguïté de conversion implicite (any2ArrowAssoc et any2stringadd)

Répondre

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

Il compile, mais tombe à l'exécution: Exception dans le thread "principal" java.lang.ClassCastException. Scala côlon $ côlon $ ne peut pas être jeté à scala.runtime.BoxedObjectArray \t à scala.runtime.RichString .format (RichString.scala: 242) –

+0

Aussi, d'où vient toList? –

+0

Correction, cela fonctionne maintenant. Je dépose un rapport de bogue - Scala ne devrait pas avoir d'exception ClassCast sauf si vous avez utilisé asInstanceOf. toList est une méthode sur Iterable [A] –

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

ou

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

Je préfère de beaucoup ce dernier, bien qu'il ait pas de paramètres régionaux * support.

  • Scala 2.8 prend en charge les paramètres régionaux avec le format RichString.
+0

L'utilisation de la méthode de format RichString est ce que j'ai choisi à la fin –