Почему IntelliJ Idea предлагает заключить строковый литерал в тройные двойные кавычки? - PullRequest
1 голос
/ 06 ноября 2011

При использовании IntelliJ Idea для кодирования Scala я заметил, что он используется для предложения заключить строковый литерал во вторую пару двойных кавычек. «Преобразовать в« »,« строку »,« »» - гласит. Если я согласен - он просто добавляет еще 2 двойные кавычки до и еще 2 после строки, чтобы моя строка выглядела как

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

Как это имеет смысл? Означают ли тройные двойные кавычки что-то особенное в Scala?

Ответы [ 2 ]

4 голосов
/ 06 ноября 2011

С IntelliJ smart String должно быть только два случая.

  • простая строка (которую можно преобразовать в тройной двойные кавычки, многострочный литерал String)
  • многострочный строковый литерал, введенный еще в Scala 2.1.7 (который можно преобразовать обратно в одну строку)

Итак, когда вы видите это:

convert to multi-line String literal

в итоге вы должны получить """.Если нет, об этом следует сообщить как об ошибке в проекте Scala youtrack .


Но , если были тройные двойные кавычки , то IntelliJ правильно преобразовал вашпростой String в многострочный литерал String, который, как , показанный langref , позволяет определять:

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

в

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

В коде Розетты упоминается , что поведение изменилось между Scala 2.7 и 2.8:

в версии 2.7, строка с тройными двойными кавычками заканчивается третьей последовательной кавычкой, в версии 2.8 заканчиваетсяпоследняя цитата из не менее трех двойных кавычек.

Scala 2.7:

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

Scala 2.8

scala> val success = """but it can on 2.8: """"
success: java.lang.String = but it can on 2.8: "
0 голосов
/ 06 ноября 2011

Тройные кавычки используются для хранения необработанных строк.

Необработанная строка может содержать любой символ, включая символы новой строки (как показано на @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  

На самом деле не большая разница, но обычно упрощается регулярное выражение.

...