gpt4 book ai didi

scala - 在搜索隐式转换时,Scala 是否使用目标类型?

转载 作者:行者123 更新时间:2023-12-01 07:20:49 25 4
gpt4 key购买 nike

我正在阅读 深入了解 Scala 这本书,第 5 章是关于隐式的。作者在第 102 页这样说:

The implicit scope used for implicit views is the same as for implicit parameters. But when the compiler is looking for type associations, it uses the type it's attempting to convert from [my emphasis], not the type it's attempting to convert to.

然而,几页之后他展示了一个示例,其中包含一个 complexmath.ComplexNumber 类。您导入 i,它是一个 ComplexNumber,并调用它的 * 方法,该方法接受一个 ComplexNumber 参数。

import complexmath.i
i * 1.0

要将 1.0 转换为 ComplexNumber,这会找到一个隐式转换,其定义如下:

package object complexmath {
implicit def realToComplex(r: Double) = new ComplexNumber(r, 0)
val i = ComplexNumber(0, 1)

但这与第一个陈述相矛盾,不是吗?它需要找到 Double => ComplexNumber。为什么它在 complexmath 包中查找,它是 ComplexNumber 的隐式范围的一部分,而不是 Double 的隐式范围的一部分?

最佳答案

规范说明了 View :

隐式范围是 T => pt 之一。

Function[T, pt],因此隐式范围包括与 Tpt 相关联的类,源和目标的转换。

scala> :pa
// Entering paste mode (ctrl-D to finish)

class B
class A
object A { implicit def x(a: A): B = new B }

// Exiting paste mode, now interpreting.

warning: there were 1 feature warning(s); re-run with -feature for details
defined class B
defined class A
defined object A

scala> val b: B = new A
b: B = B@63b41a65

scala> def f(b: B) = 3 ; def g = f(new A)
f: (b: B)Int
g: Int

scala> :pa
// Entering paste mode (ctrl-D to finish)

class A
class B
object B { implicit def x(a: A): B = new B }

// Exiting paste mode, now interpreting.

scala> val b: B = new A
b: B = B@6ba3b481

关于scala - 在搜索隐式转换时,Scala 是否使用目标类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22365105/

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