为什么IntelliJ Idea提供将字符串文字括在三倍双引号中?

时间:2011-11-06 00:00:47

标签: string scala intellij-idea quotes

在使用IntelliJ Idea编写Scala代码时,我注意到它用于提供在第二对双引号中包含字符串文字。 «转换为“”“字符串”“”» - 它说。如果我同意 - 它只是在字符串之前添加了2个双引号,并且在字符串之后再添加2个引号,使我的字符串看起来像

val myString = """my string value"""

这有什么用呢?三重双引号是否意味着Scala中的特殊内容?

2 个答案:

答案 0 :(得分:4)

使用IntelliJ smart String时,应该只有两种情况。

  • 简单字符串(可以转换为三重双引号多行字符串文字)
  • 多行字符串文字,介绍回Scala 2.1.7(可以转换回单个字符串)

所以当你看到这个:

convert to multi-line String literal

你应该以{{1​​}}结束。如果没有,则应将此报告为youtrack Scala project中的错误。


但是如果有三重双引号,那么IntelliJ正确地将您的简单字符串转换为多行字符串文字,其中illustrated by langref允许您定义:

"""

val text = "This\nIs\nA\nMultiline\nString"

Rosetta code mentions Scala 2.7和2.8之间的行为发生了变化:

  

在版本2.7上,三重双引号字符串在第三个连续引号结束,在版本2.8上它以一系列至少三个双引号的最后一个引号结束。

Scala 2.7:

val text = """This
Is
A
Multiline
String"""

Scala 2.8

scala> val error = """can't finish with a quote: """"
<console>:1: error: unterminated string
       val error = """can't finish with a quote: """"
                                                    ^

答案 1 :(得分:0)

三引号用于包含原始字符串。

原始字符串可以包含任何字符,包括换行符(如@VonC所示),但也包含转义序列。

一种常见的用法是简化正则表达式模式,例如:

val Date = """((\d\d)/(\d\d)/(\d{4}))|((\w{3}) (\d\d),\s?(\d{4}))""".r

而不是

val Date = "((\\d\\d)/(\\d\\d)/(\\d{4}))|((\\w{3}) (\\d\\d),\\s?(\\d{4}))".r  

实际上并没有太大差异,但通常会欣赏正则表达式更简单。