为什么在映射操作后将Range转换为Vector?

Seb*_*ber 8 scala scala-collections

继Coursera上的Scala课程后,Martin Odersky展示了一个示例代码:

1 to 5 map ( i => i*i )
Run Code Online (Sandbox Code Playgroud)

并且他说Range变换为a Vector因为它们共享相同的接口(IndexedSeq)并且结果不能表示为a Range (在它的示例中更清楚,因为他生成了一对不能表示为a的对Range).

我不确定理解,因为我认为他之前说过,在for表达式中,第一个生成器将决定将要生成的元素的种类,并且它似乎并不总是如此,至少对于Range.

而且我不确定为什么输出是Vector,因为Vector可能不是唯一可以表示上面计算结果的其他实现.

有人可以帮我理解这部分吗?

Rex*_*err 10

map秘密地采取一个CanBuildFrom隐含的论点.它的工作是根据您已经获得的新系列(以及内容的类型)生成新的系列.既然Range不能包含任意东西 - 甚至不包含任意整数 - 就没有CanBuildFrom产生任何东西Range.最具体的超Range确实有一个CanBuildFrom就是IndexedSeq.实际上由此构建的集合是Vector.