澄清一下为什么您的代码不起作用,以及它实际上在做什么。
val characterMap = ((0 until 10) map Nil)
为了更容易理解,我做了一些简化。
(0 until 10) 是一个Range 对象,其map 方法(对于其他集合等)需要(A) => B 类型的函数
在我们的例子中A = Int
既然类型检查器对map Nil 很满意,那么看起来Nil 在某种程度上肯定是一个函数(Int) => B,会不会?
这里的重点是Nil(i: Int) 可以用作实际存在的Nil.apply(i: Int) 的语法糖!
这是获取第i个元素的通用顺序收集方法。
运行上述代码尝试将范围元素(0,1,...,9)转换为Nil对象的对应索引值,即空List
当然空列表中没有元素,所以报错,如图
scala> val characterMap = ((0 until 10) map Nil)
java.lang.IndexOutOfBoundsException: 0
at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:52)
at scala.collection.immutable.List.apply(List.scala:84)
at scala.collection.immutable.List.apply(List.scala:84)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.immutable.Range.foreach(Range.scala:141)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
at scala.collection.AbstractTraversable.map(Traversable.scala:105)
...
结论
yield 和map 语义相同,但语法规则略有不同。
yield 期望映射函数的结果,map 期望函数本身。
该语言的另一个意想不到的微妙之处可能会让我们感到惊讶,而我们还没有完全熟悉它。