55 votes

À l'aide de varargs Scala

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

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

Il ya une raison pourquoi je dois déclarer la méthode avec un o et os Seq séparément. En gros, je me retrouve avec le format de la méthode appelée avec un seul paramètre de l'objet (de type List ). Tente:

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

Donne-moi de l'erreur de type:

trouvé: Array[Tout]

requis Seq[java.lang.Objet]

J'ai essayé de la coulée, qui compile mais ne parvient pas pour à peu près la même raison que le premier exemple. Quand j'essaie

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

cela ne parvient pas à compiler avec la conversion implicite d'ambiguïté (any2ArrowAssoc et any2stringadd)

66voto

James Iry Points 14192
def foo(msf: String, o: AnyRef, os: AnyRef*) = 
  println( String.format(msf, (o :: os.toList).toArray : _* ))

13voto

Daniel C. Sobral Points 159554
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 la dernière, même si elle n'a pas de paramètres régionaux* soutien.

  • Scala 2.8 n'ont régionaux de soutien avec RichString du format.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X