Era*_*dan 8 scala string-interpolation scala-2.10
使用Scala 2.10.0-RC1,我尝试在Windows文件路径中使用String Interpolation,例如:
val path = s"""c:\foo\bar\$fileName.csv"""
Run Code Online (Sandbox Code Playgroud)
并得到了一个例外
java.lang.StringIndexOutOfBoundsException: String index out of range: 11
Run Code Online (Sandbox Code Playgroud)
如果没有多行字符串文字("""),它就可以正常工作路径= s"""c:\ foo\bar\$ fileName.csv"""val path = s"c:\ foo\bar\$ {fileName} .csv "//> path: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
}
Run Code Online (Sandbox Code Playgroud)
这个例外是由于一个错误吗?或者我在执行字符串插值时不允许在$符号前使用反斜杠?
这里有更多的堆栈跟踪:
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.
Run Code Online (Sandbox Code Playgroud)
更新:
现在标记为Scala 2.10.1-RC1固定
https://issues.scala-lang.org/browse/SI-6631
顺便说一句,即使在修复之后,进行插值并避免转义的正确方法是使用raw:
val path = raw"c:\foo\bar\$fileName.csv"
Run Code Online (Sandbox Code Playgroud)
例如
val fileName = "myFileName" //> fileName : String = myFileName
val path = raw"c:\foo\bar\$fileName.csv" //> path : String = c:\foo\bar\myFileName.csv
Run Code Online (Sandbox Code Playgroud)
字符串插值表示法接管字符串是否为原始字符串.所有三重引用都可以引用单引号.如果您不想插值,请raw"Hi $name"改用.(除了raw在2.10.0中也有错误;修复在2.10.1 AFAIK中.)
也就是说,这不是一个非常友好的方式来处理格式错误的字符串的情况.我将它归类为一个bug,只是因为它返回了一个越界异常,而不是说转义代码无法完成.
注意:这些也打破了:
s"Hi \$name"
s"""Hi \"""
Run Code Online (Sandbox Code Playgroud)