根据Scaladoc,在map 类中没有名为Array 的方法,但是在implicit def intArrayOps (xs: Array[Int]): ArrayOps[Int] 中定义了一个隐式函数scala.Predef。因此,如果您愿意,可以在 map 上应用 Array(1,2,3,4)。但我感到困惑的是 map 结果的类型是 Array[Int] ,而不是 ArrayOps[Int] 。这是我的测试:

scala> val array = Array(1,2,3,4)
array: Array[Int] = Array(1, 2, 3, 4)

scala> array.map(x => x)
res18: Array[Int] = Array(1, 2, 3, 4)

scala> res18.isInstanceOf[Array[Int]]
res19: Boolean = true

scala> res18.isInstanceOf[scala.collection.mutable.ArrayOps[Int]]
warning: there wre 1 unchecked warnings; re-run with -unchecked for details
res20: Boolean = false

最佳答案

它确实按照预期和方便的方式返回了一个数组,您没有理由需要一个 ArrayOps,它的目的只是为数组提供额外的方法。医生错了。

该例程实际上并未在 ArrayOps 中实现。与大多数集合方法一样,它继承自 TraversableLike。你在文档中看到了两个 map 方法:

def map [B] (f: (T) ⇒ B): ArrayOps[B]
def map [B, That] (f: (T) ⇒ B)(implicit bf: CanBuildFrom[Array[T], B, That]): That

只有第二个存在(继承自 TraversableLike)。它旨在允许仅在一个地方(可遍历)实现 map ,同时始终提供最佳行为。例如,一个字符串是一个 Seq[Char],如果你用一个函数从一个字符映射到另一个字符,你会得到一个字符串,但是如果你从集合映射到 Int,结果不能是一个字符串,它只会是一个序列。这在论文 fighting the bit rot with types 中有详细解释。

然而,这会产生一个非常复杂的签名,这并不能反射(reflect)使用该方法的简单性,并且在大多数情况下生成的文档非常糟糕(您通常必须在隐式范围内追逐 CanBuildFrom 的工作)。这在 this most famous scala question of stack overflow 中讨论过。因此,扩展了工具 scaladoc 以便可能出现一个更简单的条目,对应于预期的用途。如果您查看 GenTraversableLikesource ,其中介绍了例程,您将在 map 的 scaladoc 中看到以下内容(以及许多方法中的类似内容)
@usecase def map[B](f: A => B): $Coll[B]

子类型在他们的文档 @define Coll <className> 中添加,并且 map (以及其他)带有简化的签名,标记为 [用例]。在 ArrayOpssource 中,有一个 @define Coll ArrayOps ,它应该是 Array

关于arrays - Scala中令人难以置信的隐式数组转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8284618/

10-15 23:25