字符串插值的奇怪错误

Jes*_*per 6 regex scala string-interpolation

我用以下代码得到一个奇怪的错误.

我有一个Example带有伴侣对象的类,我在其中定义了一个字符串SIGN.在类Example我有一个方法,我创建一个正则表达式,我使用字符串插值,以便我可以SIGN用来构建我的正则表达式.

这编译,但我在运行时遇到一个奇怪的错误.这是Scala的错误吗?我正在使用Scala 2.10.3(在Windows 7上).

scala> :paste
// Entering paste mode (ctrl-D to finish)

class Example {
  import Example._
  def regex = s"""$SIGN?\d+""".r
}

object Example {
  private val SIGN = """(\+|-)"""
}


// Exiting paste mode, now interpreting.

defined class Example
defined module Example

scala> val e = new Example
e: Example = Example@77c957d9

scala> e.regex
scala.StringContext$InvalidEscapeException: invalid escape character at index 1 in "?\d+"
        at scala.StringContext$.treatEscapes(StringContext.scala:229)
        at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:90)
        at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:90)
        at scala.StringContext.standardInterpolator(StringContext.scala:123)
        at scala.StringContext.s(StringContext.scala:90)
        at Example.regex(<console>:9)
Run Code Online (Sandbox Code Playgroud)

Jes*_*per 6

仔细查看堆栈跟踪后,我看到发生了什么.

您可以看到该方法s是在字符串上执行的,该字符串处理替换$SIGN.该方法\d在字符串中遇到并显然试图翻译它; 看到treatEscapes堆栈跟踪中的调用.该treatEscapes方法无法识别\d并抛出异常.

它可以通过写入\\d字符串来修复,但这会破坏具有三引号字符串的整个目的......

结论:字符串插值和三引号字符串似乎相互干扰.我会说这是一个Scala bug.(为什么该s方法处理转义?).

编辑 - 这确实看起来像Travis Brown在评论中指出的错误SI-6476.