Math 如何‘;1*BigInt(1)和#x2019;工作,我该怎么做?
我尝试实现一些数字类型,我遇到了Math 如何‘;1*BigInt(1)和#x2019;工作,我该怎么做?,math,scala,numeric,implicit,Math,Scala,Numeric,Implicit,我尝试实现一些数字类型,我遇到了 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
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)
^
虽然我在查看代码时无法确定解决方案,但还是有办法的
是什么机制使它工作的
编辑:我用我遇到的实际问题创建了一个新问题。我认为您的Num类中缺少*方法,该方法接受Num作为参数。当应用程序
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)
好地方!我想我的例子太简单了。看起来我的实际问题是另一个问题,虽然有相同的错误信息…回答得很好。有关其含义和范围的更多信息,请参阅。
1 * BigInt(1)