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

9

map的源代码可以在Array上找到:

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个回答

15
通常情况下,当你在某个库类的源代码中看到throw new Error()时,它代表编译器正在介入并通过桥接到平台设施(记住这可以是Java或.NET)来实现该方法。 数组SID解释了如何在Scala 2.7.x中处理数组,以及它们在2.8中如何改变。如果你调用map,编译器会神奇地将对象转换为BoxedArray
在2.8中,将数组集成到Scala集合框架中主要使用正常语言特性来处理——从Array[T]到上下文相关的WrappedArray[T]ArraySeq[T]的隐式转换,以及类型为Manifest[T]的隐式参数来支持创建泛型类型T的数组。数组索引长度更新仍然显示为throw new Error()。而Array#map不再存在,取而代之的是WrappedArrayArraySeq中的常规方法。 更新 如果你想知道这个编译器魔法是如何定义的,请查看Scala 2.8版本的Cleanup.scala

4

看起来这只是假代码,因为Scala数组实际上就是Java数组。


类似于“本地”的?在Java中,我的意思是,就像……“嘿,别担心,我知道该怎么做。” - OscarRyz
那是我的猜测,虽然我不确定。 - pdbartlett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接