Scala运算符重载,左侧参数为内置

标签 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
}

在这个例子中,以下工作:

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/

相关文章:

c++ - 使用 basic_ostream 重载 operator<<

c++ - 将调用哪个重载版本的运算符

scala - 为什么通过 jenkins 用户在构建从站上运行测试失败并缺少 scala-library.jar?

java - 如何在 Scala 中流式传输标准输出?

c++ - 运算符重载 "operator T * ()"产生比较运算符?

c++赋值运算符=用派生类重载

c++ - 运算符重载和不同的模板参数

scala 模式匹配 (Try,Try)

mysql - jOOQ 为嵌套选择生成的 SQL 在 MySQL/MariaDB 中不起作用

java - 我如何获得 akka actor 的 CPU 利用率