如何在scala中使用插值将双引号插入到String中

时间:2014-01-13 07:51:49

标签: scala intellij-idea

无法转义函数中的所有引号

(它的基本用法 - >如果我发现字符串什么都不做,如果它不是字符串添加“在开头和结尾)

代码段:

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

唯一有用的是:

  

case _ =>的 “” “\” $值\ “” “”

有更好的语法吗?

它看起来很糟糕,IDE(IntelliJ)用红色标记它(但是让你运行它真的很生气!!!!!)

11 个答案:

答案 0 :(得分:31)

这是Scala中的错误:

  

escape does not work with string interpolation

但也许你可以使用:

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

答案 1 :(得分:22)

您不需要使用三引号字符串来转义引号,因此s""""$value"""""将起作用。不可否认,它看起来也不好。

答案 2 :(得分:17)

另一种解决方案(在Scala tracker中也提到)是使用

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

仍然很难看,但有时可能比三重引号更受欢迎。

似乎转义序列$"被建议为2.1 SIP-24的一部分:

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

该SIP从未被接受,因为它包含其他更有争议的建议。目前,我们努力将2.13中实现的转义序列$"设为Pre SIP/mini SIP $” escapes in interpolations

答案 3 :(得分:8)

对于您的用例,它们可以轻松实现良好的语法。

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

在一个包裹对象的某处隐藏着。

当然,您可以将插值器命名为q以外的其他内容。

上周,有人询问ML是否有能力使用反引号标识符。现在你可以做res3而不是res4:

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

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

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

刚刚发生的另一个想法是f-interpolator已经做了一些工作来按摩你的弦。例如,它必须智能地处理“%n”。它可以同时处理一个额外的转义“%q”,它不会传递给底层格式化程序。

这看起来像是:

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

这值得增强请求。

更新:刚刚注意到在插值中不推荐使用octals:

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

答案 4 :(得分:6)

这解决了我的问题,我测试了这个,这就是我使用的。

overflow:hidden;

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

答案 5 :(得分:5)

如前所述,this is a known bug in Scala。解决方法是使用\042

答案 6 :(得分:2)

怎么样

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

答案 7 :(得分:2)

在我的情况下使用得很多,因此我创建了这个版本:

indexPath

答案 8 :(得分:2)

简单方法: -

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

答案 9 :(得分:1)

在字符串插值中按预期启动 Scala 2.13.6 转义双引号 work

Welcome to Scala 2.13.6 (OpenJDK 64-Bit Server VM, Java 15.0.2).
Type in expressions for evaluation. Or try :help.

scala> s"\"Hello\""
val res0: String = "Hello"

scala> s"$"Hello$""
val res1: String = "Hello"

答案 10 :(得分:0)

进一步采取@Pascalius建议。 class StringImprovements扩展并继承AnyVal。

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

Scala只使用StringImprovements类创建一个中间对象,在该对象上隐式调用两个扩展方法dqt&amp; SQT。尽管如此,我们可以通过使类继承自AnyVal来消除此对象的创建并提高性能。对于Scala,提供了值类型,专门用于编译器将通过直接调用方法来替换对象的情况。

这是一个在混合中使用上述隐式类的简单示例,其中我们使用命名变量(string&amp; boolean)和插值字符串中的函数。

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