当前位置: 首页 > 知识库问答 >
问题:

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

百里金林
2023-03-14

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

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

共有1个答案

太叔乐家
2023-03-14

如前所述,使用隐式转换将int转换为complex将完成这项工作。

下面是一个可行的解决方案,它将所有这些问题结合在一起,以补充伊万的答案:

import scala.language.implicitConversions

class Complex(val real:Double, val imaginary:Double){
    def +(other:Complex) = new Complex(real+other.real, imaginary+other.imaginary)
    //def +(other:Double) = new Complex(real+other,imaginary) // Not needed now
    def ==(other:Complex) = real==other.real && imaginary==other.imaginary
    override def toString: String = s"$real + ${imaginary}i"
}

object Complex {
    implicit def intToComplex(real: Int): Complex = doubleToComplex(real.toDouble)
    implicit def doubleToComplex(real: Double): Complex = Complex(real, 0)

    implicit def apply(real: Double, imaginary: Double): Complex = new Complex(real, imaginary)
    implicit def apply(tuple: (Double, Double)): Complex = Complex(tuple._1, tuple._2)

    def main(args: Array[String]) {
        val c1 = Complex(1, 2)
        println(s"c1: $c1")

        val c2: Complex = (3.4, 4.2) // Implicitly convert a 2-tuple
        println(s"c2: $c2")

        val c3 = 2 + c1
        println(s"c3: $c3")

        val c4 = c1 + 2 // The 2 is implicitly converted then complex addition is used
        println(s"c4: $c4")
    }
}

一些注意事项:

    null
 类似资料:
  • 这是在参数是重载函数时重载解析如何工作中提到的更复杂的问题? 下面的代码编译起来没有任何问题: 模板参数推导似乎不是一项具有挑战性的任务-只有一个函数接受两个参数。但是,取消注释的模板重载(仍然只有一个参数)会无缘无故地破坏编译。gcc 5. x/6. x和clang 3.9的编译都失败了。 它可以用重载解析/模板参数推导规则来解释,还是应该在这些编译器中被限定为缺陷?

  • 问题内容: 该代码无法编译,编译器说f含糊。但是我认为第二种方法可以解决什么问题? 问题答案: 这是因为无法确定该方法调用是应调用变量args还是应调用float和变量args。 Java决定以这种方式来调用拓宽>装箱>变量args的方法,但是在这种情况下,两者都具有变量args。 在这种情况下,基本上将char扩展为浮动。 Java基元的扩展顺序为:

  • 我当时正在研究超载问题,我完全被促销搞糊涂了。我看了SO(函数重载中的隐式转换序列)中的几篇文章,我确信还有一些文章可用,但找不到合适的文章。我也指的是http://www.dcs.bbk.ac.uk/~roger/cpp/week20。htm。我在看Stroustrup的C编程特别版时,看到了下面的解释。 通过在参数表达式的类型和函数的参数(形式参数)之间寻找最佳匹配,可以从一组重载函数中找到要

  • 在下面的代码中,我为数组下标运算符提供了默认参数。 但是,编译器生成了一个错误: 但是,如果我为函数调用操作符提供默认参数。 很好用。 所以,我有一个问题: 为什么不允许数组下标运算符的默认参数

  • } } 输出: 条件=错误 我找不到这个输出的逻辑,bcoz'if(o.a==a 这里我给出了不同的值,但我认为是短路运算符(

  • 问题内容: 所以我试图理解: 在: 在: 如果用作关键字参数,该消失: 在: 是什么原因造成的? 问题答案: 确实与这无关。您实际上是这样调用函数的: Python首先满足位置参数,而您的第一个参数是。然后,应用关键字参数,并 再次 提供。 无法检测到您已经提供了第一个位置参数作为关键字参数。通过用关键字参数替换位置参数,不会增加您的通话次数。 在混合使用位置参数和关键字参数时,必须注意不要重复使