根据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 以便可能出现一个更简单的条目,对应于预期的用途。如果您查看
GenTraversableLike
的 source ,其中介绍了例程,您将在 map 的 scaladoc 中看到以下内容(以及许多方法中的类似内容)@usecase def map[B](f: A => B): $Coll[B]
子类型在他们的文档
@define Coll <className>
中添加,并且 map (以及其他)带有简化的签名,标记为 [用例]。在 ArrayOps
的 source 中,有一个 @define Coll ArrayOps
,它应该是 Array
。关于arrays - Scala中令人难以置信的隐式数组转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8284618/