为什么scala(1到1000).foreach会在这种情况下抛出异常?

时间:2013-04-17 18:31:19

标签: scala

在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)

2 个答案:

答案 0 :(得分:11)

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

val str = "%s%s".format("asdf", "sdff")
// "asdfsdff" you see, only 8 characters
(1 until 10000).foreach(x => str.getCharAt(x))

答案 1 :(得分:7)

scala中的

Strings可以像索引中的函数一样使用给定索引处的char:

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

这是Scala中的一般机制,其中具有apply方法的对象可以像处理函数一样对待。字符串的apply方法在StringOps中定义。

字符串“asdfsdff”正在传递给foreach,并且该范围中的每个连续值都将传递给该函数。当索引达到8时会抛出异常,因为它超出了范围。