加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 19:19:30 所属栏目:安全 来源:网络整理
导读:根据 Scaladoc,在Array类中没有名为map的方法,但是有一个隐式函数隐式def intArrayOps(xs:Array [Int]):在scala.Predef中定义的ArrayOps [Int].因此,如果您愿意,可以在Array(1,2,3,4)上应用map.但令我困惑的是,地图结果是Array [Int]类型,而不是ArrayOps [
根据 Scaladoc,在Array类中没有名为map的方法,但是有一个隐式函数隐式def intArrayOps(xs:Array [Int]):在scala.Predef中定义的ArrayOps [Int].因此,如果您愿意,可以在Array(1,2,3,4)上应用map.但令我困惑的是,地图结果是Array [Int]类型,而不是ArrayOps [Int].这是我的测试:

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

scala> array.map(x => x)
res18: Array[Int] = Array(1,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.你在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

只存在第二个(继承自TraversableLike).它旨在允许在一个地方(可遍历的地方)实施地图,同时总是提供最好的行为.例如,String是Seq [Char]的一个,如果你用一个函数从一个字符映射到另一个字符,你得到一个String,但如果你从集合映射到Int,结果不能是一个字符串,它只是一个Seq.这在文章fighting the bit rot with types中有更详细的解释.

但是,这会产生一个非常复杂的签名,这并不能反映使用该方法的简单性,并且在大多数情况下会使文档非常糟糕(通常情况下,您必须追逐隐式作用域中的CanBuildFrom).这在this most famous scala question of stack overflow中进行了讨论.因此扩展了工具scaladoc,以便可以出现与预期用法相对应的更简单的条目.如果您查看引入例程的GenTraversableLike的source,您将在scaladoc中看到以下内容(在许多方法中也是类似的)

@usecase def map[B](f: A => B): $Coll[B]

子类型在他们的doc @define Coll< className>中添加,并且map(以及其他)与简化签名一起出现,标记为[Use case].在ArrayOps的source中,有一个@define Coll ArrayOps,它应该是Array.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读