Scala运算符使用左手参数重载为内置

Tes*_*act 3 scala operator-overloading

我想编写一个可以很好地处理数字和运算符的类,所以我想知道当左手参数是内置类型或其他我无法修改实现的值时如何重载运算符.

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
}
Run Code Online (Sandbox Code Playgroud)

通过此示例,以下工作:

val c = new Complex(3,4)
c+2 == new Complex(5,4)  //true
Run Code Online (Sandbox Code Playgroud)

但我也希望能够写作

2+c
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为Int.+不能接受类型的参数Complex.有没有办法让我写这个并让它按我想要的方式工作?

我发现了关于正确的关联方法,但它们似乎需要不同的运算符名称.

Iva*_*iev 6

您可以添加从Int到Complex的隐式转换:

implicit def intToComplex(real: Int) = new Complex(real, 0)
Run Code Online (Sandbox Code Playgroud)

你可以阅读有关implicits的内容(例如:在Scala中理解隐含).简短版本是,如果您的程序没有进行类型检查,将尝试当前作用域中的所有含义,如果其中一些有效,则编译器将应用它.

因此,当您编写时2 + c,编译器找不到在Int中使用复数的运算符+,因此它会尝试使用implicits.然后它将编译2 + cintToComplex(2) + c哪个将正常工作.