无法转义函数中的所有引号
(它的基本用法 - >如果我发现字符串什么都不做,如果它不是字符串添加“在开头和结尾)
代码段:
def putTheDoubleQuotes(value: Any): Any = {
value match {
case s: String => s //do something ...
case _ => s"\"$value\"" //not working
}
}
唯一有用的是:
case _ =>的 “” “\” $值\ “” “”
有更好的语法吗?
它看起来很糟糕,IDE(IntelliJ)用红色标记它(但是让你运行它真的很生气!!!!!)
答案 0 :(得分:31)
这是Scala中的错误:
但也许你可以使用:
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}"
}