演算子とメソッド
昨日書いたオブジェクトのメソッド呼び出しを「<オブジェクト名> <関数名> <引数>」で実行できる件について、みずしまさんよりコメントを頂いた(ありがとうございます!)ので、仕様書を確認。
どうも、メソッド呼び出しと演算子がまったく別物という認識がそもそも間違っていたようだ。Scalaではクラスの演算子をメソッドとして定義するのと同じノリで、メソッドも演算子のように利用することができると理解して納得。
// 「+」演算子をオーバーライドしたクラス。 class Foo(i:Int) { def +(j:Int):Int = i+j def plus(j:Int):Int = i+j } // 「+」メソッドを演算子として使えるのと同様に // 普通のメソッド「plus」も演算子的に使うことができる。 var foo = new Foo(3) println( foo + 3 ) // 6 println( foo plus 3 ) // 6 // ただし、優先順位(*や/は+,-より優先的に評価される)は決まっているので注意。 println( foo + 3 << 2 ) // (foo + 3) << 2 = 24 println( foo plus 3 << 2 ) // foo plus ( 3 << 2) = 15
なお、結合の優先順位は決まっている。この辺はThe Scala Language Specification - 6.12.3 Infix Operationsで定義されているのでそちらを参照。