Przy użyciu Scala 2.10.0-RC1, spróbowałem użyć interpolacji ciągów w ścieżce pliku systemu Windows, np. tak:Czy jest to błąd w interpolacji łańcuchowej Scala 2.10 wewnątrz ciągu wieloliniowego z odwrotnym ukośnikiem?
val path = s"""c:\foo\bar\$fileName.csv"""
I got wyjątek
java.lang.StringIndexOutOfBoundsException: String index out of range: 11
Bez wielowierszowego łańcucha dosłownym ("""
) to działa dobrze val path = s "" "c: \ foo \ bar \ $ fileName .csv ""” val path = s "c: \ foo \ bar \ $ {nazwa_pliku} .csv" //> path: String = c: \ foo \ bar \ myFile.csv
Dalsze badania do odtworzenia numer:
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
}
Czy to wyjątek z powodu błędu? lub po prostu nie mogę używać lewego ukośnika przed znakiem $ podczas wykonywania interpolacji String?
Oto więcej na stacktrace:
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.
Aktualizacja:
teraz oznaczone jako stałe dla Scala 2.10.1-RC1
https://issues.scala-lang.org/browse/SI-6631
Przy okazji , nawet po fixie, właściwą drogą do interpolacji i uniknięcia ucieczki jest użycie raw
:
val path = raw"c:\foo\bar\$fileName.csv"
np.
val fileName = "myFileName" //> fileName : String = myFileName
val path = raw"c:\foo\bar\$fileName.csv" //> path : String = c:\foo\bar\myFileName.csv
PS: Zdaję sobie sprawę, że to RC, a błędy są prawdopodobnie, nie jestem pewien, czy to jest –
You report umieścić to na https://issues.scala-lang.org. Zobacz, co otrzymam po usunięciu "scala> s" "" c: \ foo \ bar $ fileName.csv "" " res9: String = c: ♀oo? ArX.csv' –
Wow. miło :) Próbowałem się tam zarejestrować, dostałem wiadomość, że nie mam uprawnień, czy wiesz, czego mi brakuje? –