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的引号.
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)
| 归档时间: |
|
| 查看次数: |
23779 次 |
| 最近记录: |