我想编写一个可以很好地处理数字和运算符的类,所以我想知道当左侧参数是内置类型或我无法修改的其他值时如何重载运算符实现。
class Complex(val r:Double,val i:Double){
def +(other:Complex) = new Complex(r+other.r,i+other.i)
def +(other:Double) = new Complex(r+other,i)
def ==(other:Complex) = r==other.r && i==other.i
}
在这个例子中,以下工作:
val c = new Complex(3,4)
c+2 == new Complex(5,4) //true
但我也希望能够写作
2+c
这不起作用,因为 Int.+
不能接受 Complex
类型的参数。
有没有办法让我写这个并让它按照我的意愿工作?
我发现了右关联方法,但它们似乎需要不同的运算符名称。
最佳答案
您可以添加从 Int 到 Complex 的隐式转换:
implicit def intToComplex(real: Int) = new Complex(real, 0)
您可以阅读有关隐式的信息(例如,此处:Understanding implicit in Scala)。简短的版本是,如果您的程序不进行类型检查,则将尝试当前范围内的所有隐式,如果其中一些有效,则编译器将应用它。
所以,当你编写 2 + c
时,编译器在 Int 中找不到接受复数的运算符 +,因此它会尝试隐式。然后它将 2 + c
编译为 intToComplex(2) + c
,这将正常工作。
关于Scala运算符重载,左侧参数为内置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23547199/