2012-11-08 9 views
8

Utilizzando Scala 2.10.0-RC1, ho provato a utilizzare Interpolazione stringa all'interno di un percorso file Windows, ad es. in questo modo:Si tratta di un errore in Scala 2.10 Interpolazione stringa all'interno di una stringa multilinea con barra rovesciata?

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

E trovato un'eccezione

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

Senza la stringa multilinea letterale (""") funziona bene percorso val = s "" "c: \ foo \ bar \ $ filename .csv "" " val path = s" c: \ foo \ bar \ $ {fileName} .csv "//> percorso: String = c: \ foo \ bar \ myFile.csv

Ulteriori test da riprodurre il problema:

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 
} 

Questa eccezione è dovuta a un errore? o semplicemente non mi è consentito utilizzare la barra rovesciata prima del segno $ quando si esegue l'interpolazione String?

Qui è più del 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. 

Aggiornamento:

Ora contrassegnato come fisso per Scala 2.10.1-RC1

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

Tra l'altro , anche dopo la correzione, il modo corretto di eseguire l'interpolazione ed evitare la fuga sta usando raw:

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

ad es.

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

P.S. Sono consapevole che è un RC, e probabilmente sono bug, ma non sono sicuro che sia –

+1

Segnala che lo hai inserito su https://issues.scala-lang.org. Guarda cosa ottengo quando rimuovo uno "\" 'scala> s" "" c: \ foo \ bar $ fileName.csv "" " res9: String = c: ♀oo? ArX.csv' –

+0

Wow. bello :) Ho provato a registrarmi lì, ha ricevuto un messaggio che indica che non ho i permessi, sai cosa mi manca? –

risposta

8

La notazione di interpolazione stringa prende il controllo del fatto che una stringa sia o meno una stringa non elaborata. Tutto quel triplo quoting ti dà la possibilità di citare virgolette singole. Se non si desidera l'interpolazione, utilizzare invece raw"Hi $name". (Tranne raw è anche bacato in 2.10.0, una correzione è in 2.10.1 AFAIK.)

Detto questo, questo non è un modo molto amichevole per affrontare la situazione di avere una stringa malformata. Lo classificherei come un bug, solo perché restituisce un'eccezione out-of-bounds e non qualcosa che dice che un codice di escape non può essere completato.

Nota: questi rottura anche:

s"Hi \$name" 
s"""Hi \""" 
Problemi correlati