gpt4 book ai didi

math - ‘1 * BigInt(1)’ 如何工作,我该如何做?

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

我尝试实现一些数字类型,但我遇到了问题

mynum * 1

有效,但不是
1 * mynum

我试图定义这样的隐式转换
case class Num(v: Int) {
def * (o: Int) = new Num(v*o)
}

implicit def int2Num(v: Int) = Num(v)

但它似乎不起作用,因为我总是收到以下错误:
scala> 1 * new Num(2)
<console>:14: error: overloaded method value * with alternatives:
(x: Double)Double <and>
(x: Float)Float <and>
(x: Long)Long <and>
(x: Int)Int <and>
(x: Char)Int <and>
(x: Short)Int <and>
(x: Byte)Int
cannot be applied to (Num)
1 * new Num(2)
^

另一方面
1 * BigInt(1)

有效,所以必须有一种方法,尽管我在查看代码时无法确定解决方案。

让它发挥作用的机制是什么?

编辑:我用我遇到的实际问题创建了一个新问题, Why is the implicit conversion not considered in this case with generic parameters? .

最佳答案

当申请a.meth(args)失败,编译器从 a 搜索隐式 View 到具有方法的东西 meth .任何符合 A => { def meth(...) } 的隐式值或方法会做。如果找到,则将代码重写为 view(a).meth(args) .

它在哪里看?首先,它在当前范围内查找,由本地定义的隐式和导入的隐式组成。

(实际上有搜索的第二阶段,其中考虑了带有按名称参数的转换方法,但这对这个答案并不重要。)

如果失败,它将在隐式范围内查找。这由我们正在搜索的类型的“部分”的伴随对象组成。在这种情况下,我们在 A => { def meth(...) } 之后,所以我们只看 A 的伴生对象(及其父类(super class)型)。

在 Scala 主干中,隐式作用域是 extended a tiny bit , 包括参数类型的伴随对象。不确定这是否已经在 2.9.1 中,也许友好的读者会为我弄清楚并更新此答案。

所以1 + BigInt(2)扩展为 BigInt.int2bigInt(1) + BigInt(2)

关于math - ‘1 * BigInt(1)’ 如何工作,我该如何做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7647835/

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