2014-01-13 8 views
28

Probleme einfügen alle in meiner Funktion, die Anführungszeichen zu entkommenWie doppelte Anführungszeichen in String mit Interpolation in scala

(grundlegende Verwendung von it -> wenn ich eine Zeichenfolge finde nichts zu tun, wenn sie nicht ein String "add in Anfang und Ende)

Code-Schnipsel:

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

einzige, was arbeitete, war:

Fall _ => s ""“ \ "$ value \" "" ""

Gibt es eine bessere Syntax dafür?

es sieht schrecklich aus und die IDE (IntelliJ) markiert es in rot (aber können Sie es laufen die kotzt mich wirklich !!!!!)

+0

wenn Sie die dreifache Anführungszeichen verwenden, brauchen Sie nicht den umgekehrten Schrägstrich – sschaef

Antwort

22

Das ist ein Fehler in Scala:

escape does not work with string interpolation

aber vielleicht können Sie verwenden:

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 
+0

dies: s "\" $ value \ "" wird nicht funktionieren von der Kommandozeile (nicht nur von der IDE) – Nimrod007

+3

vielleicht sollte ich umformulieren: _escape funktioniert nicht mit String interpolation_ in ** Scala ** und daher in ** IntelliJ ** – abzcoding

+0

dachte, du sagtest es ein intellij gemeldet Bug ... auf irgendeine Weise suche ich nette Syntax und die EscapeJava ist ärgerlich – Nimrod007

14

Sie don Sie müssen keine Anführungszeichen in der Zeichenkette mit drei Anführungszeichen entzweien, damit s""""$value""""" funktioniert. Zugegeben, es sieht auch nicht gut aus.

+1

ich denke, es sieht noch schlimmer :) – Nimrod007

+1

Wie wäre es 's" "" "$ value" "" "" .trim'? :) –

+0

es wird immer besser mit der .trim – Nimrod007

6

Für Ihren Anwendungsfall machen sie es einfach, eine gute Syntax zu erreichen.

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 das implizit weg in einem Paketobjekt irgendwo.

Sie können den Interpolator neben q natürlich etwas anderes nennen.

Letzte Woche fragte jemand auf der ML nach der Möglichkeit, Backquoted Bezeichner zu verwenden. Gerade jetzt können Sie res3 tun, aber nicht RES4:

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

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

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

Eine weitere Idee, die nur mir einfiel war, dass das f-Interpolator bereits führt einige Zeichenfolge zu massieren. Zum Beispiel muss es intelligent mit "% n" umgehen. Es könnte gleichzeitig einen zusätzlichen Escape "% q" verarbeiten, den es nicht an den zugrunde liegenden Formatierer übergibt.

Das aussehen würde:

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

Das ist eine Verbesserung Anfrage wert ist.

Update: habe gerade bemerkt, dass octals in Einschaltungen noch nicht veraltet sind:

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

Sie mögen '% q' nicht. https://issues.scala-lang.org/browse/SI-8147 –

8

Eine andere Lösung (auch im Scala tracker erwähnt) ist

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

noch hässlich, zu verwenden, aber manchmal vielleicht kann gegenüber dreifachen Anführungszeichen bevorzugt werden.

Es scheint eine $" Escape-Sequenz als Teil SIP-24 für 2,12 vorgeschlagen wurde - ich bin nicht sicher, was der aktuelle Status dieser Vorschlag akzeptiert wird, aber wenn akzeptiert, könnte man schreiben:

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

Wie

über

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

2

Es ist schwer, in meinem Fall verwendet, deshalb habe ich diese Version:

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

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

Unter @Pascalius Vorschlag weiter ein paar Schritte. Klasse StringImprovements erweitert und erbt AnyVal.

object StringUtil{ 
    implicit class StringImprovements(val s: String) extends AnyVal { 
     def dqt = "\""+s+"\"" // double quote 
     def sqt = s"'$s'"  // single quote 
    } 
} 

Scala verwendet nur die StringImprovements Klasse ein Zwischenobjekt zu erstellen, auf dem DQT & sqt implizit die beiden Erweiterungsmethoden zu nennen. Nichtsdestotrotz können wir die Erzeugung dieses Objekts eliminieren und die Leistung verbessern, indem wir die Klasse von AnyVal erben lassen. Für Scala bietet der Werttyp speziell für solche Fälle, in denen der Compiler das Objekt ersetzt, indem er den Aufruf der Methode direkt ausführt.

Hier ist ein einfaches Beispiel mit der oben genannten impliziten Klasse in einem Intermix, wo wir benannte Variablen (String & boolean) und eine Funktion in der Interpolationszeichenfolge verwenden.

import StringUtil._ 
abstract class Animal { 
    ... 
    override def toString(): String = s"Animal:${getFullName().dqt}, CanFly:$canFly, Sound:${getSound.dqt}" 
} 
0

einfache Art und Weise: -

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