gpt4 book ai didi

scala - Scala 编译器会找出 CanBuildFrom 的哪个实例?

转载 作者:行者123 更新时间:2023-12-04 10:05:20 25 4
gpt4 key购买 nike

每个人 。请原谅我在 Scala 上问了一个愚蠢的问题。
虽然我已经用 Scala 编程了大约 2 年,但我仍然觉得很难理解 implicit用法。举个例子来讨论:

Array(1,2,3,4).map(x => x) 

如果您查找 scaladoc,则找不到方法 mapArray类(class)。原因 map可以申请 Array(1,2,3,4)是有一个隐函数 implicit def intArrayOps (xs: Array[Int]): ArrayOps[Int]定义于 scala.Predef .

但是,有两个参数列表,其中第二个写为 implicit bf: CanBuildFrom[Array[T], B, That]) .现在我想知道编译器在哪里找到类型 CanBuildFrom 的正确参数申请时 mapArray(1,2,3,4) .

最佳答案

隐式解析包括搜索伴生对象 隐式参数的类型 以及 伴生对象 隐式参数的类型参数 .在上面的例子中,map 的签名如下

def map[B, That](f: (Int) => B)(implicit bf: CanBuildFrom[Array[Int], B, That]): That

由于我们对 That 没有类型要求,我们现在可以忽略它。在我们查看本地和容器范围并没有找到匹配的隐式之后,下一个寻找隐式的地方将是 CanBuildFrom 的伴随对象。但是它没有伴生对象。所以我们继续在 Array 中寻找一个隐式。我们找到一种形式
implicit def canBuildFrom[T](implicit m: ClassManifest[T]): CanBuildFrom[Array[_], T, Array[T]]

由于我们没有类型要求和匹配的隐式,“That”被强制为 Array[Int] 类型并完成我们的输入。

关于scala - Scala 编译器会找出 CanBuildFrom 的哪个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8293173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com