Question Comment insérer des guillemets doubles dans String avec interpolation dans Scala


Avoir du mal à échapper à tous les guillemets de ma fonction

(utilisation de base -> si je trouve qu'une chaîne ne fait rien, si ce n'est pas une chaîne, ajoutez-la "au début et à la fin)

extrait de code :

  def putTheDoubleQuotes(value: Any): Any = {
    value match {
      case s: String => s //do something ...
      case _  => s"\"$value\"" //not working
    }
  }

La seule chose qui marchait était:

case _ => s "" "\" $ value \ "" ""

existe-t-il une meilleure syntaxe pour cela?

ça a l'air terrible et l'IDE (IntelliJ) le marque en rouge (mais ça te laisse courir ce qui me fait vraiment chier !!!!!)


34
2018-01-13 07:51


origine


Réponses:


Ceci est un bug dans Scala:

escape ne fonctionne pas avec l'interpolation de chaîne

mais peut-être que vous pouvez utiliser:

scala> import org.apache.commons.lang.StringEscapeUtils.escapeJava
import org.apache.commons.lang.StringEscapeUtils.escapeJava

scala> escapeJava("this is a string\nover two lines")
res1: java.lang.String = this is a string\nover two lines

22
2018-01-13 07:56



Vous n'avez pas besoin d'échapper les guillemets dans une chaîne entre guillemets, donc s""""$value""""" marchera. Certes, ça n'a pas l'air bien non plus.


17
2018-01-13 09:00



Une autre solution (également mentionnée dans le Scala tracker) est à utiliser

case _ => s"${'"'}$value${'"'}"

Encore moche, mais parfois peut-être peut être préféré aux citations triples.

Il semble une séquence d'évasion $" a été suggéré comme une partie de SIP-24 pour 2.12 - Je ne suis pas sûr de l'état actuel de l'acceptation de cette suggestion, mais si elle est acceptée, on pourrait écrire:

case _ => s"$"$value$""

12
2018-04-20 14:08



Pour votre cas d'utilisation, ils facilitent la réalisation d'une belle syntaxe.

scala> implicit class `string quoter`(val sc: StringContext) {
     | def q(args: Any*): String = "\"" + sc.s(args: _*) + "\""
     | }
defined class string$u0020quoter

scala> q"hello,${" "*8}world"
res0: String = "hello,        world"

scala> "hello, world"
res1: String = hello, world       // REPL doesn't add the quotes, sanity check

scala> " hello, world "
res2: String = " hello, world "   // unless the string is untrimmed

Squirrel loin de l'implicite dans un objet package quelque part.

Vous pouvez nommer quelque chose d'interpolateur q, bien sûr.

La semaine dernière, quelqu'un a demandé sur le ML la possibilité d'utiliser des identifiants à backquotes. En ce moment, vous pouvez faire res3 mais pas res4:

scala> val `"` = "\""
": String = "

scala> s"${`"`}"
res3: String = "

scala> s"hello, so-called $`"`world$`"`"
res4: String = hello, so-called "world"

Une autre idée qui m'est venue à l'esprit était que le f-interpolator fait déjà un travail pour masser votre chaîne. Par exemple, il doit gérer "% n" intelligemment. Il pourrait, en même temps, gérer un échappement supplémentaire "% q" qu'il ne transmettrait pas au formateur sous-jacent.

Cela ressemblerait à ceci:

scala> f"%qhello, world%q"
<console>:9: error: conversions must follow a splice; use %% for literal %, %n for newline

Cela vaut une demande d'amélioration.

Mise à jour: juste remarqué que les octaux ne sont pas encore obsolètes dans les interpolations:

scala> s"\42hello, world\42"
res12: String = "hello, world"

8
2018-01-13 13:13



Cela a corrigé le problème pour moi, je l'ai testé et c'est ce que j'ai utilisé.

raw""" 
   Inside this block you can put "as many" quotes as you "want" and even "${5 + 7}" interpolate inside the quotes 
"""

http://docs.scala-lang.org/overviews/core/string-interpolation.html#the-raw-interpolator


5
2018-03-01 19:22



Comme déjà mentionné, c'est un bug connu dans Scala. Une solution de contournement consiste à utiliser \042.


4
2017-09-12 20:00



Que diriez-vous

s"This is ${"\"" + variable + "\""}" inserted in string with quotes


2
2018-02-06 04:48



Il est très utilisé dans mon cas, donc j'ai créé cette version:

object StringUtil{
    implicit class StringImprovements(s: String) {
        def quoted = "\""+s+"\""
    }
}

val myStatement = s"INSERT INTO ${tableName.quoted} ..."

2
2018-02-14 12:32



Manière simple: -

val str="abc"
println(s"$str") //without double quotes
println(s"""\"$str\"""") // with double quotes

1
2017-11-13 08:47