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行がまったく同じだね。