繁体   English   中英

'1 * BigInt(1)'如何工作?我怎么能这样做?

[英]How does ‘1 * BigInt(1)’ work and how can I do the same?

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

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)

虽然我在查看代码时无法确定解决方案,但仍然有办法。

使其运作的机制是什么?

编辑:我用我遇到的实际问题创建了一个新问题, 为什么在这种情况下不考虑使用泛型参数的隐式转换?

当一个应用程序a.meth(args)发生故障,用于从隐式视图编译器搜索a到的东西,有方法meth 任何符合A => { def meth(...) }隐式值或方法都可以。 如果找到一个,则代码被重写为view(a).meth(args)

它看起来在哪里? 首先,它查看当前范围,由本地定义的含义和导入的含义组成。

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

如果失败,则查看隐式范围。 这包括我们正在搜索的类型的“部分”的伴随对象。 在这种情况下,我们在A => { def meth(...) } ,所以我们只看A的伴随对象(及其超类型)。

在Scala主干中,隐式范围扩展了一小部分 ,以包括参数类型的伴随对象。 不确定这是否已经在2.9.1中,也许友好的读者会为我解决这个问题并更新这个答案。

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

我认为你在Num类中缺少*方法,它接受Num作为参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM