为什么Scala中Array.map的定义是“throw new Error()”

时间:2010-05-21 19:09:03

标签: scala

Arraymap源代码为:

override def map[B](f: A => B): Array[B] = throw new Error()

但是以下工作:

val name : Array[String]= new Array(1)
name(0)="Oscar"
val x = name.map {  ( s: String ) => s.toUpperCase }
// returns: x: Array[java.lang.String] = Array(OSCAR)

2 个答案:

答案 0 :(得分:15)

通常,当您在库类的源代码中看到throw new Error()时,它表示编译器正在干预并通过桥接到平台的工具来实现该方法的点(请记住,这可能是Java或.NET)。

Array SID解释了如何在Scala 2.7.x中处理数组,以及它们在2.8中的变化。如果您调用BoxedArray

,编译器常常将对象神奇地转换为map

在2.8中,将数组集成到Scala集合框架主要通过使用普通语言特征来处理 - 从Array[T]WrappedArray[T]ArraySeq[T]的隐式转换,具体取决于上下文,以及Manifest[T]类型的隐式参数,以支持创建泛型类型T的数组。数组indexinglengthupdate仍显示为throw new Error()Array#map已不再存在,而是在WrappedArrayArraySeq上将其作为常规方法发现。

<强>更新

如果您有兴趣知道这个编译器魔术已定义,请查看Cleanup.scala的Scala 2.8版本。

答案 1 :(得分:4)

看起来它只是虚拟代码,因为Scala数组实际上是Java代码。