Meilleur formatage des chaînes dans Scala

Avec trop d’arguments, Ssortingng.format devient trop compliqué. Existe-t-il un moyen plus puissant de formater une chaîne. Ainsi:

 "This is #{number} ssortingng".format("number" -> 1) 

Ou est-ce que ce n’est pas possible à cause de problèmes de type (le format devrait prendre une carte [Ssortingng, Any], je suppose, je ne sais pas si cela pourrait empirer les choses).

Ou est-ce la meilleure façon de le faire comme ceci:

 val number = 1 This is { number } ssortingng text 

même s’il pollue l’espace de nommage?

Modifier:

Bien qu’un simple proxénétisme puisse dans de nombreux cas, je cherche également quelque chose dans le même sens que le format() de Python format() (voir: http://docs.python.org/release/3.1.2/library/ssortingng). html # formatssortingngs )

Dans Scala 2.10, vous pouvez utiliser l’ interpolation de chaîne .

 val height = 1.9d val name = "James" println(f"$name%s is $height%2.2f meters tall") // James is 1.90 meters tall 

Eh bien, si votre seul problème est de rendre l’ordre des parameters plus flexible, cela peut être fait facilement:

 scala> "%d %d" format (1, 2) res0: Ssortingng = 1 2 scala> "%2$d %1$d" format (1, 2) res1: Ssortingng = 2 1 

Et il y a aussi le remplacement regex à l’aide d’une carte:

 scala> val map = Map("number" -> 1) map: scala.collection.immutable.Map[java.lang.Ssortingng,Int] = Map((number,1)) scala> val getGroup = (_: scala.util.matching.Regex.Match) group 1 getGroup: (util.matching.Regex.Match) => Ssortingng =  scala> val pf = getGroup andThen map.lift andThen (_ map (_.toSsortingng)) pf: (util.matching.Regex.Match) => Option[java.lang.Ssortingng] =  scala> val pat = "#\\{([^}]*)\\}".r pat: scala.util.matching.Regex = #\{([^}]*)\} scala> pat replaceSomeIn ("This is #{number} ssortingng", pf) res43: Ssortingng = This is 1 ssortingng 

Peut-être que le plug-in Scala-Enhanced-Ssortingngs-peut vous aider. Regardez ici:

Scala-Enhanced-Ssortingngs-Plugin Documentation

Vous pouvez facilement implémenter vous-même une mise en forme plus riche (avec l’approche pimp-my-library):

 scala> implicit def RichFormatter(ssortingng: Ssortingng) = new { | def richFormat(replacement: Map[Ssortingng, Any]) = | (ssortingng /: replacement) {(res, entry) => res.replaceAll("#\\{%s\\}".format(entry._1), entry._2.toSsortingng)} | } RichFormatter: (ssortingng: Ssortingng)java.lang.Object{def richFormat(replacement: Map[Ssortingng,Any]): Ssortingng} scala> "This is #{number} ssortingng" richFormat Map("number" -> 1) res43: Ssortingng = This is 1 ssortingng 

Voici la réponse que je suis venu chercher ici:

 "This is %s ssortingng".format(1) 

Si vous utilisez 2.10, utilisez l’interpolation intégrée. Sinon, si vous ne vous souciez pas des performances extrêmes et que vous n’avez pas peur des one-liners fonctionnels, vous pouvez utiliser un pli + plusieurs parsings d’expressions rationnelles:

 val template = "Hello #{name}!" val replacements = Map( "name" -> "Aldo" ) replacements.foldLeft(template)((s:Ssortingng, x:(Ssortingng,Ssortingng)) => ( "#\\{" + x._1 + "\\}" ).r.replaceAllIn( s, x._2 )) 

Vous pouvez également envisager l’utilisation d’un moteur de template pour des chaînes longues et complexes. Sur ma tête, j’ai Scalate qui implémente entre autres le moteur de template Moustache .

Cela peut être exagéré et la perte de performance pour les chaînes simples, mais vous semblez être dans ce domaine où ils commencent à devenir de vrais modèles.