2012-11-08 6 views
8

Scala 2.10.0-RC1を使用して、Windowsファイルパス内でString Interpolationを使用しようとしました。このような:これはScala 2.10のバグですか?バックスラッシュを含む複数行文字列内の文字列補間?

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

リテラル複数行の文字列がなければ例外

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

を得ましたが(""")は、それだけで正常に動作します ヴァル・パス= S "" "C:\ FOO \バー\ $ fileNameに.csv "" " val path =" "c:\ foo \ bar \ $ {fileName} .csv" //>パス:文字列= 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. 

更新:ところでスカラ座2.10.1-RC1

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

固定として今マーク

、修正した後でも補間を行い、エスケープを避ける正しい方法はを使用しています:

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

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

P.S.私はそれがRCであることを認識しており、バグはおそらく確かではありません。もしそれが –

+1

なら、あなたはhttps://issues.scala-lang.orgに載っています。 'scala> s" "" c:\ foo \ bar $ fileName.csv "" " res9:String = c:♀oo?arX.csv' –

+0

Wowを削除すると、何が得られますか?素敵な1つ:私はそこに登録しようとしました、私はアクセス許可がないというメッセージがあります、あなたは私が行方不明を知っていますか? –

答えて

8

文字列補間表記は、文字列が生の文字列かどうかを制御します。三重引用符を使うと、一重引用符を引用することができます。補間しない場合は、代わりにraw"Hi $name"を使用してください。 (rawも2.10.0でバグがありますが、修正は2.10.1 AFAIKのためです)

これは、不正な形式の文字列を持つ状況に対処するための非常に友好的な方法ではありません。私は、エスケープコードが完了できないと言っているものではなく、範囲外の例外を返すので、バグとして分類します。

注:これらもブレーク:

s"Hi \$name" 
s"""Hi \""" 
関連する問題