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"
wenn Sie die dreifache Anführungszeichen verwenden, brauchen Sie nicht den umgekehrten Schrägstrich – sschaef