2012-11-08 15 views
8

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 
+0

PS: Zdaję sobie sprawę, że to RC, a błędy są prawdopodobnie, nie jestem pewien, czy to jest –

+1

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' –

+0

Wow. miło :) Próbowałem się tam zarejestrować, dostałem wiadomość, że nie mam uprawnień, czy wiesz, czego mi brakuje? –

Odpowiedz

8

Notacja interpolacji ciągów przejmuje kontrolę nad tym, czy ciąg jest łańcuchem ciągłym, czy też nie. Wszystkie te potrójne cytaty pozwalają ci zacytować pojedyncze cytaty. Jeśli nie chcesz interpolacji, użyj zamiast tego raw"Hi $name". (Z wyjątkiem raw jest również wadliwy w wersji 2.10.0, a poprawka dotyczy wersji 2.10.1 AFAIK.)

To nie jest bardzo przyjazny sposób radzenia sobie z sytuacją posiadania nieprawidłowo sformatowanego napisu. Sklasyfikuję go jako błąd, tylko dlatego, że zwraca wyjątek poza zakresem, a nie coś, co mówi, że kodu ucieczki nie można ukończyć.

Uwaga: to przerwa również:

s"Hi \$name" 
s"""Hi \""" 
Powiązane problemy