scala中令人难以置信的隐式数组转换

爱国者*_*爱国者 7 arrays scala implicit

根据Scaladoc,没有mapArray类中命名的方法,但是在中implicit def intArrayOps (xs: Array[Int]): ArrayOps[Int]定义了一个隐式函数scala.Predef.所以,你可以申请mapArray(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
Run Code Online (Sandbox Code Playgroud)

Did*_*ont 11

它确实返回一个数组,按照预期和方便,没有理由你需要一个ArrayOps,它只是为数组提供额外的方法.该文档是错误的.

该例程实际上没有在ArrayOps中实现.作为大多数收集方法,它继承自TraversableLike.你在doc中看到了两种map方法:

def map [B] (f: (T) ? B): ArrayOps[B]
def map [B, That] (f: (T) ? B)(implicit bf: CanBuildFrom[Array[T], B, That]): That
Run Code Online (Sandbox Code Playgroud)

只存在第二个(继承自TraversableLike).它旨在允许在一个地方(可遍历的地方)实施地图,同时总是提供最好的行为.例如,String是Seq [Char]的一个,如果你用一个函数从一个字符映射到另一个字符,你得到一个String,但是如果你从集合映射到Int,结果不能是一个字符串,它只是一个Seq.在与类型对抗腐烂的论文中对此进行了详细解释.

但是,这会产生一个非常复杂的签名,这并不能反映使用该方法的简单性,并且在大多数情况下都会产生非常差的文档(通常您必须追逐隐式作用域中的CanBuildFrom才能工作).这是在这个最着名的堆栈溢出的scala问题中讨论过的.因此扩展了工具scaladoc,以便可以出现与预期用法相对应的更简单的条目.如果你看一下GenTraversableLike,在引入程序,你会看到在scaladoc在地图下面的(和一个类似的许多方法)

@usecase def map[B](f: A => B): $Coll[B]
Run Code Online (Sandbox Code Playgroud)

子类型在其文档中添加@define Coll <className>,并且地图(以及其他)与简化签名一起显示,标记为[用例].在ArrayOps,有一个@define Coll ArrayOps地方应该是Array.