Является ли это ошибкой интерполяции строк Scala 2.10 внутри многострочной строки с обратной косой чертой?

Используя Scala 2.10.0-RC1, я попытался использовать интерполяцию строк внутри пути к файлу Windows, например. нравится:

val path = s"""c:\foo\bar\$fileName.csv""" 

И получил исключение

java.lang.StringIndexOutOfBoundsException: String index out of range: 11

Без многострочного строкового литерала (""") он прекрасно работает val path = s"""c:\foo\bar\$fileName.csv""" val path = s"c:\foo\bar\${fileName}. csv" //> путь: String = c:\foo\bar\myFile.csv

Дальнейшее тестирование для воспроизведения проблемы:

object wcScala10 {

  util.Properties.versionString   //> res0: String = version 2.10.0-RC1
  val name = "James"              //> name  : String = James
  val test1 = s"Hello $name"      //> test1  : String = Hello James
  val test2 = s"""Hello $name"""  //> test2  : String = Hello James
  val test3 = """Hello \$name"""  //> test3  : String = Hello \$name
  val test4 = s"""Hello \$name""" //> java.lang.StringIndexOutOfBoundsException: 
                                  //>   String index out of range: 7
}

Это исключение связано с ошибкой? или мне просто не разрешено использовать обратную косую черту перед знаком $ при интерполяции строк?

Вот еще трассировка стека:

java.lang.StringIndexOutOfBoundsException: String index out of range: 7
    at java.lang.String.charAt(String.java:686)
    at scala.collection.immutable.StringOps$.apply$extension(StringOps.scala :39)
    at scala.StringContext$.treatEscapes(StringContext.scala:202)
    at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:90)
    at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:90)
    at scala.StringContext.standardInterpolator(StringContext.scala:120)
    at scala.StringContext.s(StringContext.scala:90)
    at wcScala10$$anonfun$main$1.apply$mcV$sp(wcScala10.scala:9)
    at org.scalaide.worksheet.runtime.library.WorksheetSupport$$anonfun$$exe
 cute$1.apply$mcV$sp(WorksheetSupport.scala:76)
    at org.scalaide.worksheet.runtime.library.WorksheetSupport$.redirected(W
 orksheetSupport.scala:65)
    at org.scalaide.worksheet.runtime.library.WorksheetSupport$.$execute(Wor
 ksheetSupport.scala:75)
    at wcScala10$.main(wcScal
 Output exceeds cutoff limit.

Обновление:

Теперь отмечено как исправленное для Scala 2.10.1-RC1.

https://issues.scala-lang.org/browse/SI-6631

Кстати, даже после исправления правильный способ сделать интерполяцию и избежать экранирования — это использовать raw:

val path = raw"c:\foo\bar\$fileName.csv"

e.g.

val fileName = "myFileName"               //> fileName  : String = myFileName
val path = raw"c:\foo\bar\$fileName.csv"  //> path  : String = c:\foo\bar\myFileName.csv

person Eran Medan    schedule 08.11.2012    source источник
comment
p.s. Я знаю, что это RC, и вероятны ошибки, просто не уверен, что это так.   -  person Eran Medan    schedule 09.11.2012
comment
Вы сообщаете о размещении этого на issues.scala-lang.org. Посмотрите, что я получаю, когда удаляю \ scala> s"""c:\foo\bar$fileName.csv""" res9: String = c:♀oo?arX.csv   -  person Santosh Gokak    schedule 09.11.2012
comment
Ух ты. хороший :) Я пытался зарегистрироваться там, он получил сообщение о том, что у меня нет разрешений, вы знаете, что мне не хватает?   -  person Eran Medan    schedule 09.11.2012
comment
issues.scala-lang.org/browse/SI-6631 создан   -  person Santosh Gokak    schedule 09.11.2012
comment
@SantoshGokak спасибо! Кстати, как туда попасть?   -  person Eran Medan    schedule 09.11.2012
comment
@SantoshGokak да, я забыл упомянуть, что пробовал это. Я получаю это сообщение: У вас нет разрешения на вход. Если вы считаете, что это неправильно, обратитесь к своим администраторам JIRA.   -  person Eran Medan    schedule 09.11.2012


Ответы (1)


Нотация интерполяции строк берет на себя управление тем, является ли строка необработанной строкой или нет. Все, что дает вам тройное цитирование, — это возможность цитировать одинарные кавычки. Если вы не хотите интерполяции, используйте вместо нее raw"Hi $name". (За исключением того, что raw также содержит ошибки в 2.10.0; исправление для 2.10.1, насколько мне известно.)

Тем не менее, это не очень удобный способ справиться с ситуацией, когда строка имеет неверный формат. Я бы классифицировал это как ошибку только потому, что она возвращает исключение за пределами границ, а не то, что говорит о том, что escape-код не может быть завершен.

Примечание: они также ломаются:

s"Hi \$name"
s"""Hi \"""
person Rex Kerr    schedule 08.11.2012