Scala:IndexOutOfBoundsException在映射时发生

Wei*_*Liu 0 scala map

我在Windows下使用Scala 2.10.3和Java 1.7.0_45(64位)在我的代码中

List.range(0, 10) map {ListBuffer[Int]()}
Run Code Online (Sandbox Code Playgroud)

抛出java.lang.IndexOutOfBoundsException.但另一方面,

List.range(0, 10) map {i => ListBuffer[Int]()}
Run Code Online (Sandbox Code Playgroud)

效果很好.

所以我想知道为什么会这样?两个表达式之间有什么区别吗?

Lee*_*Lee 5

ListBuffer[T]的apply方法查找给定索引处的元素.因此,您可以将a ListBuffer[T]视为一种功能Int => T:

val buf = ListBuffer[Int](1, 2, 3);
val f: Int => Int = buf
val i = f(1)    //i == 2
Run Code Online (Sandbox Code Playgroud)

因此,您的第一个示例是传递给map一个函数,该函数在空列表缓冲区中的给定索引处查找元素,即它等效于

List.range(0, 10) map {i => ListBuffer[Int]()(i)}
Run Code Online (Sandbox Code Playgroud)

因此例外.