web-dev-qa-db-fra.com

Utilisation de varargs de Scala

J'arrache mes cheveux en essayant de comprendre comment faire ce qui suit:

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 la méthode avec un o et un osSeq séparément. Fondamentalement, je me retrouve avec la méthode de formatage appelée avec un paramètre d'objet unique (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:

trouvé: Array [Any]

seq requis [Java.lang.Object]

J'ai essayé le casting, qui se compile mais échoue pour à peu près la même raison que le premier exemple. Quand j'essaye

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

cela ne se compile pas avec une ambiguïté de conversion implicite (any2ArrowAssoc et any2stringadd)

54
oxbow_lakes
def foo(msf: String, o: AnyRef, os: AnyRef*) = 
  println( String.format(msf, (o :: os.toList).toArray : _* ))
65
James Iry
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 loin ce dernier, même s'il ne prend pas en charge les paramètres régionaux *.

  • Scala 2.8 prend en charge les paramètres régionaux avec le format RichString.
13
Daniel C. Sobral