scala中原始字符串插值和三重引号之间的区别是什么

ntn*_*ntn 45 string scala string-interpolation

Scala有三个引用的字符串"""String\nString""",可以在字符串中使用特殊字符而不进行转义.Scala 2.10也添加raw"String\nString"了相同的用途.

如何raw""和""""""工作有什么区别?他们可以为同一串产生不同的输出吗?

ale*_*nan 64

查看默认插值器的源代码(在这里找到:https://github.com/scala/scala/blob/2.11.x/src/library/scala/StringContext.scala)看起来像"原始"插值器调用每个字母上的身份功能,所以你输入的是你得到的.您将发现的最大区别是,如果您在源中提供包含引号字符的字符串文字,则原始插补器仍然无法工作.即你不能说

raw"this whole "thing" should be one string object"
Run Code Online (Sandbox Code Playgroud)

但你可以说

"""this whole "thing" should be one string object"""
Run Code Online (Sandbox Code Playgroud)

所以你可能想知道"为什么我会费心使用原始插补器呢?" 答案是原始插值器仍然执行变量替换.所以

val helloVar = "hello"
val helloWorldString = raw"""$helloVar, "World"!\n"""
Run Code Online (Sandbox Code Playgroud)

将为您提供字符串"hello",世界"!\n",其中\n未被转换为换行符,以及围绕单词world的引号.

  • 基本上,你说 `raw` 做 `s` 做的事情。我可以`s"""$literal string with替换"""`。无论如何,这并不能解释对 `row` 的需求。 (3认同)

som*_*ytt 27

令人惊讶的是,即使使用三引号,使用s-interpolator也会重新开启:

scala> "hi\nthere."
res5: String =
hi
there.

scala> """hi\nthere."""
res6: String = hi\nthere.

scala> s"""hi\nthere."""
res7: String =
hi
there.
Run Code Online (Sandbox Code Playgroud)

s-interpolator不知道它正处理最初三重引用的字符串部分.因此:

scala> raw"""hi\nthere."""
res8: String = hi\nthere.
Run Code Online (Sandbox Code Playgroud)

当您以其他方式使用反斜杠时,这很重要,例如正则表达式:

scala> val n = """\d"""
n: String = \d

scala> s"$n".r
res9: scala.util.matching.Regex = \d

scala> s"\d".r
scala.StringContext$InvalidEscapeException: invalid escape character at index 0 in "\d"
  at scala.StringContext$.loop$1(StringContext.scala:231)
  at scala.StringContext$.replace$1(StringContext.scala:241)
  at scala.StringContext$.treatEscapes0(StringContext.scala:245)
  at scala.StringContext$.treatEscapes(StringContext.scala:190)
  at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:94)
  at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:94)
  at scala.StringContext.standardInterpolator(StringContext.scala:124)
  at scala.StringContext.s(StringContext.scala:94)
  ... 33 elided

scala> s"""\d""".r
scala.StringContext$InvalidEscapeException: invalid escape character at index 0 in "\d"
  at scala.StringContext$.loop$1(StringContext.scala:231)
  at scala.StringContext$.replace$1(StringContext.scala:241)
  at scala.StringContext$.treatEscapes0(StringContext.scala:245)
  at scala.StringContext$.treatEscapes(StringContext.scala:190)
  at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:94)
  at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:94)
  at scala.StringContext.standardInterpolator(StringContext.scala:124)
  at scala.StringContext.s(StringContext.scala:94)
  ... 33 elided

scala> raw"""\d$n""".r
res12: scala.util.matching.Regex = \d\d
Run Code Online (Sandbox Code Playgroud)

  • 的确确实很奇怪,而不是我原本想的那样。感谢您指出。 (2认同)