Ошибка исходных строк Scala при экранировании Юникода

В Scala String необходимо включить этот буквальный дословно: \usepackage{x}, Таким образом, желательным было бы то, что для

val s = """ ... \usepackage{X} ... """

println(s)
... \usepackage{X} ...

Попытки пока включают,

scala> """\usepackage{X}"""
<console>:1: error: error in unicode escape
       """\usepackage{X}"""
            ^

scala> raw"""\usepackage{X}"""
<console>:1: error: error in unicode escape
       raw"""\usepackage{X}"""
               ^

Одиночные строки в двойных кавычках также оказываются неудачными.

После http://docs.scala-lang.org/overviews/core/string-interpolation.html рабочий пример включает

scala> raw"a\nb"
res1: String = a\nb

который не распространяется на случаи Unicode.

1 ответ

Решение

Похоже, вы столкнулись с проблемой SI-4706: буквальный синтаксис Unicode препятствует распространенным случаям использования тройных кавычек.

В Scala escape-последовательности Юникода обрабатываются не только внутри символьных или строковых литералов. Может быть не очевидно, что следующий код будет работать:

scala> 5 \u002B 10
res0: Int = 15

К сожалению, кажется, что нет хорошего способа обойти это, если вы не хотите полностью отключать экранирование Юникода (-Xno-uescape). Одним из предложенных в этой проблеме обходных путей является разделение символа обратной косой черты:

scala> """\""" + """usepackage{X}"""
res1: String = \usepackage{X}
Другие вопросы по тегам