Utilisation de varargs de Scala
-
06-07-2019 - |
Question
Je me coupe les cheveux en essayant de comprendre comment procéder:
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 os
Seq
séparément. En gros, 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é: Tableau [Tous]
requis Seq [java.lang.Object]
J'ai essayé le casting, qui compile mais échoue pour la même raison que le premier exemple. Quand j'essaye
println(String.format(msg, (o :: List(os:_*)) :_* ))
la compilation avec une ambiguïté de conversion implicite échoue ( any2ArrowAssoc
et any2stringadd
)
La solution
def foo(msf: String, o: AnyRef, os: AnyRef*) =
println( String.format(msf, (o :: os.toList).toArray : _* ))
Autres conseils
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 n'a pas de support pour les paramètres régionaux *.
- Scala 2.8 prend en charge les paramètres régionaux avec le format RichString.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow