覆盖Scala中的“运算符”和println方法

时间:2018-11-04 10:02:37

标签: scala operators

我需要为不同类型的基本操作创建方法,以便表达式println(1 + 2*I + I*3 + 2)的输出为3+5i。我是Scala的新手,到目前为止,这里是我所拥有的:

class IClass() {

  var value = 0
  def *(number: Int): String = {
    //value += number
    value + "i"
  }

}

object ComplexNumbers {

  var TotalValue: Int = 0
  var TotalString: String = ""
  // ...

  def Complex(num1: Int, num2: Int): String ={
    num1 + "+" + num2 + "i"
  }

  implicit class IntMultiply(private val a: Int) extends AnyVal {

    def + (b: String)= {
      if(b.contains("i")){
        TotalValue += a
        TotalString.concat(b)
      }
    }

    def * (b: IClass) = {
      //b.value += a
      a + "i"
    }
  }

  implicit class StringAdd(private val a: String) extends AnyVal {
    def + (b: String): String = {
      if(b.contains("i")){

      }
      a + "i"
    }
  }

  def main(args: Array[String]) {

    println(Complex(1,2)) // 1+2i

    val I = new IClass()
    println(1 + 2*I + I*3 + 2) // 3+5i

    // val c = (2+3*I + 1 + 4*I) * I
    // println(-c) // 7-3i
  }
}

我认为我朝着错误的方向前进,因为通过在类型上实现这些操作方法,我在println中遇到了错误:Type Mismach因为Any返回类型(我仅更新字段)没有返回任何东西。知道如何实现吗?

1 个答案:

答案 0 :(得分:3)

您应该将复数视为具有某些行为的类,并首先对其进行定义,而不是着眼于您目前所追求的一个具体副作用。似乎是反直觉的,但是实现一个抽象性更强的问题通常比将工作范围缩小到仅处理手头的任务要容易得多。

case class ComplexInt(real: Int, im: Int) {
   def + (other: ComplexInt) = ComplexInt(real + other.real, im + other.im)
   def * (other: ComplexInt) = ComplexInt(
      real * other.real - im * other.im, 
      real * other.im + im * other.real
   )
   def unary_- = ComplexInt(-real, -im)
   def -(other: ComplexInt) = this + -other

   override def toString() = (if(real == 0 && im != 0) "" else real.toString) + (im match {
     case 0 => ""
     case 1 if real == 0 => "i"
     case 1 => " + i"
     case n if n < 0 || real == 0 => s"${n}i"
     case n => s"+${n}i"
   })
}

object ComplexInt {
   val I = ComplexInt(0, 1)
   implicit def fromInt(n: Int) = ComplexInt(n, 0)
}

现在,您只需要import ComplexInt.I, 然后类似println(1 + 2*I + I*3 + 2)之类的内容会打印3+5i等。

您甚至可以执行(1 + 2*I)*(2 + 3*I)(评估为-4+7i)。