8

使用 Scala 2.10.0-RC1,我尝试在 Windows 文件路径中使用字符串插值,例如:

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

并得到了一个例外

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

没有多行字符串文字 ( """) 它工作得很好 val path = s"""c:\foo\bar\$fileName.csv""" val path = s"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.

更新:

现在标记为 Scala 2.10.1-RC1 已修复

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

顺便说一句,即使在修复之后,进行插值和避免转义的正确方法是使用raw

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
4

1 回答 1

8

字符串插值表示法控制字符串是否为原始字符串。三重引号让您能够引用单引号。如果您不想插值,请raw"Hi $name"改用。(除了raw2.10.0 中的错误;2.10.1 AFAIK 中有一个修复程序。)

也就是说,这不是一种非常友好的方式来处理格式错误的字符串。我将它归类为错误,只是因为它返回了一个越界异常,而不是说无法完成转义代码。

注意:这些中断也:

s"Hi \$name"
s"""Hi \"""
于 2012-11-08T20:43:11.427 回答