2014-01-13 174 views
28

有麻烦逃避所有的报价在我的功能如何在Scala中插入双引号将字符串插值

(基本它的用法 - >如果我找到一个字符串什么也不做,如果它不是一个字符串添加“,在begin和end)

代码片段:

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

唯一令工作是:

情况_ =>的 “”” \“$ value \”“”“”

有更好的语法吗?

它看起来可怕和IDE(的IntelliJ)中红色标记它(但可以让你运行它真正地尿尿我!!!!!)

+0

当你使用三引号,你不需要反斜线 – sschaef

回答

22

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

这样的:的“\” $值\“”在命令行不会工作(不仅从IDE) – Nimrod007

+3

也许我应该改写:_escape不能与字符串interpolation_在**斯卡拉**,因此在** IntelliJ ** – abzcoding

+0

认为你说它的intellij报告错误...任何方式即时寻找好语法和escapeJava很烦人 – Nimrod007

14

你不不需要用三引号字符串来引号,所以s""""$value"""""将会起作用。诚然,它也不好看。

+1

我认为它看起来更糟:) – Nimrod007

+1

怎么样'“”“”$ value“”“”“ .trim'?:) –

+0

它使用.trim更好 – Nimrod007

6

对于您的用例,它们可以很容易地实现很好的语法。

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-插值已经做了一些工作,以按摩的字符串另一个想法。例如,它必须智能地处理“%n”。它可以在同一时间处理额外的转义“%q”,它不会传递给底层的格式化程序。

这将是这样的:

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

这是值得的增强请求。

更新:刚才注意到,八进制未在插值弃用尚未:

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

他们不喜欢'%q'。https://issues.scala-lang.org/browse/SI-8147 –

8

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

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

还难看,但有时可能可能优于三重报价。

这似乎是一个转义序列$"建议为SIP-24一部分为2.12 - 我不知道什么是当前接受这种建议的状态,但如果接受的话,我们可以写:

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

如何约

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

2

它巨资我的情况下使用,所以我创造了这个版本:

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

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

以@Pascalius建议几个步骤进一步。类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 & SQT。尽管如此,我们可以通过使该类继承自AnyVal来消除此对象的创建并提高性能。对于这种情况,Scala提供了值类型,编译器会直接调用方法来替换对象。

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

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

简单的方法: -

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