我在Windows下使用Scala 2.10.3和Java 1.7.0_45(64位) 在我的代码中
List.range(0, 10) map {ListBuffer[Int]()}
抛出java.lang.IndexOutOfBoundsException。但另一方面,
List.range(0, 10) map {i => ListBuffer[Int]()}
运作良好。
所以我想知道为什么会这样?两个表达式之间有什么区别吗?
答案 0 :(得分:5)
ListBuffer[T]
的apply方法查找给定索引处的元素。因此,您可以将ListBuffer[T]
视为函数Int => T
:
val buf = ListBuffer[Int](1, 2, 3);
val f: Int => Int = buf
val i = f(1) //i == 2
因此,您的第一个示例是向map
传递一个函数,该函数在空列表缓冲区中的给定索引处查找元素,即它等效于
List.range(0, 10) map {i => ListBuffer[Int]()(i)}
因此例外。
答案 1 :(得分:3)
@Lee是对的,或者使用填充方法:
List.fill(10) {ListBuffer[Int]()}
这一行产生10个空的ListBuffers