Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

ScalaのSnippetを写経する(3)-Complex Operations

Snippet: Complex Operations | The Scala Programming Language
Scalaには「演算子」という概念はない。
「+」という名前のメソッドにすぎない。
だから演算子のオーバーライドで悩まされることもない。

package sample.snippet

object ComplexOperations extends Application{

  class Complex(val re: Double, val im: Double) {
    def + (that: Complex) = {
      new Complex(re + that.re, im + that.im)
    }
    
    def - (that: Complex) = {
      new Complex(re - that.re, im - that.im)
    }
    
    def * (that: Complex) = {
      new Complex(re * that.re - im * that.im, 
        im * that.re + im * that.re)
    }
    
    def / (that: Complex) = {
      val denom = that.re * that.re + that.im * that.im
      new Complex((re * that.re + im * that.im) / denom,
        (im * that.re - re * that.im) / denom)
    }
    
    override def toString = {
      re + (if (im < 0) "-" + (-im) else "+" + im) + "*i"
    }
  }
  
  val x = new Complex(2, 1)
  val y = new Complex(1, 3)
  println(x + y)
  println(x - y)
  println(x * y)
  println(x / y)  

  println(x.+(y))
  println(x.-(y))
  println(x.*(y))
  println(x./(y))  
  
}

「x + y」の記述は結局のところメソッド呼び出しの「.」が省略でき、引数が1つなら()も省略できるから、
演算子のように「見える」だけ。
「x + y」 = 「x.+(y)」である。
だからprintlnの出力はどちらも同じ。
# ちなみにComplexは複素数のこと。


実行結果。

3.0+4.0*i
1.0-2.0*i
-1.0+2.0*i
0.5-0.5*i
3.0+4.0*i
1.0-2.0*i
-1.0+2.0*i
0.5-0.5*i

上4行と下4行がまったく同じだね。