Scala编译器发现了什么CanBuildFrom实例?

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

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

Array(1,2,3,4).map(x => x) 
Run Code Online (Sandbox Code Playgroud)

如果你查看scaladoc,你就无法mapArray课堂上找到这个方法.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).

Nei*_*ssy 9

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

def map[B, That](f: (Int) => B)(implicit bf: CanBuildFrom[Array[Int], B, That]): That
Run Code Online (Sandbox Code Playgroud)

因为我们没有类型要求我们现在可以忽略它.在我们查看本地和容器范围并找不到匹配的含义之后,查找隐式的下一个位置将是CanBuildFrom的伴随对象.但它没有伴侣对象.所以我们继续并在Array中查看隐式.我们找到一个形式的

implicit def canBuildFrom[T](implicit m: ClassManifest[T]): CanBuildFrom[Array[_], T, Array[T]]
Run Code Online (Sandbox Code Playgroud)

由于我们没有类型要求和匹配隐式,因此"That"必须是Array [Int]类型并完成我们的输入.


kir*_*uku 7

StackOverflow上的其他问题部分回答了这个问题.让我试一试总结一下:

您需要知道的第一部分是Scala编译器查找implicits的位置.您可以在此处找到有关CanBuildFrom的更多详细信息.

如果你已经理解了关于implicits的答案中提到的内容,那么你应该看一下Scala Collections的构造.它们的继承层次结构在此处解释,并在此处列出.所有这些都是与Builders建立起来的.有关breakOut的问题详细解释了这一点.

为了汇总你的知识,你应该知道如何对收藏品进行皮条客.此外,这个问题在StackOverflow中有解释.

请注意,StackOverflow的最佳答案总结在Scala-Tag-Wiki中.