我在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)
效果很好.
所以我想知道为什么会这样?两个表达式之间有什么区别吗?
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)
因此例外.