How to insert double quotes into String with inter

2020-01-30 23:54发布

Having trouble escaping all the quotes in my function

(basic usage of it -> if i find a string do nothing, if its not a string add " in the begin and end)

code snippet :

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

only thing that worked was :

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

is there a better syntax for this ?

it looks terrible and the IDE (IntelliJ) marks it in red (but lets you run it which really pisses me!!!!!)

11条回答
Emotional °昔
2楼-- · 2020-01-31 00:45

You don't need to escape quotes in triple-quoted string, so s""""$value""""" will work. Admittedly, it doesn't look good either.

查看更多
祖国的老花朵
3楼-- · 2020-01-31 00:46

For your use case, they make it easy to achieve nice syntax.

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 the implicit away in a package object somewhere.

You can name the interpolator something besides q, of course.

Last week, someone asked on the ML for the ability to use backquoted identifiers. Right now you can do res3 but not res4:

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

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

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

Another idea that just occurred to me was that the f-interpolator already does some work to massage your string. For instance, it has to handle "%n" intelligently. It could, at the same time, handle an additional escape "%q" which it would not pass through to the underlying formatter.

That would look like:

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

That's worth an enhancement request.

Update: just noticed that octals aren't deprecated in interpolations yet:

scala> s"\42hello, world\42"
res12: String = "hello, world"
查看更多
走好不送
4楼-- · 2020-01-31 00:48

This is a bug in Scala:

escape does not work with string interpolation

but maybe you can use:

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
查看更多
Explosion°爆炸
5楼-- · 2020-01-31 00:48

An example:

scala> val username="admin"

username: String = admin

scala> val pass="xyz"

pass: String = xyz

scala> println(s"""{"username":"$username", "pass":"$pass"}""")

{"username":"admin", "pass":"xyz"}

查看更多
神经病院院长
6楼-- · 2020-01-31 00:59

As already mentioned, this is a known bug in Scala. A workaround is to use \042.

查看更多
登录 后发表回答