7

在 repl 中,这会引发异常,我不知道为什么。我真的很想了解这一点。

scala> (1 until 10000).foreach("%s%s".format("asdf", "sdff"))
java.lang.StringIndexOutOfBoundsException: String index out of range: 8
    at java.lang.String.charAt(String.java:686)
    at scala.collection.immutable.StringLike$class.apply(StringLike.scala:54)
    at scala.collection.immutable.WrappedString.apply(WrappedString.scala:32)
    at scala.collection.immutable.WrappedString.apply(WrappedString.scala:32)
    at scala.collection.immutable.Range.foreach(Range.scala:75)
4

2 回答 2

12

将下面的代码视为未包装的伪代码:

val str = "%s%s".format("asdf", "sdff")
// "asdfsdff" you see, only 8 characters
(1 until 10000).foreach(x => str.getCharAt(x))
于 2013-04-17T18:35:00.850 回答
7

Strings在 scala 中,可以像从索引到给定索引处的字符的函数一样使用:

val s: Int => Char = "abcd"
val c: Char = s(1)

这是 Scala 中的一种通用机制,apply可以将具有方法的对象视为函数。字符串的apply方法在StringOps中定义。

字符串“asdfsdff”被传递给foreach,并且范围内的每个连续值都被传递给函数。当索引到达时,这会引发异常,8因为这超出了范围。

于 2013-04-17T18:37:22.780 回答