2012年9月9日日曜日

[Scala] 後のオブジェクトのメソッドが実行される演算子

Scala では 「:(コロン)で終わる演算子」 を中置記法で使うと 「後のオブジェクトのメソッド」 が実行される。代表的な例が、List#:: 。

val aList = List("A");
println (aList.::("x")); 
println ("x" :: aList);

List(x, A) List(x, A)

「 aList.::("x") 」では普通のメソッドと同様に aList の :: メソッドが実行される。
「"x" :: aList 」と中置記法で書くと、通常は演算子の前のオブジェクトがレシーバーになるのと違い、 演算子の後にある aList がレシーバーになる。



クラスを作って確認する。

...
    val aColonSampleClass = new ColonSampleClass("hoge");
    aColonSampleClass.@@@:("xxx");
    "xxx" @@@: aColonSampleClass; 
...
class ColonSampleClass(val value : String) {
   def @@@:(arg : String) {
     println(value);
   }
}

hoge hoge

識別子に記号とそれ以外は混在できないのでメソッド名は「 @@@: 」 とした。
確かに 「 "xxx" @@@: aColonSampleClass 」 で aColonSampleClass がレシーバーになっている。

演算子の後のオブジェクトがレシーバーになるのはメソッド名が「:で終わる」ことが条件なので、たとえ「:」が含まれていても、メソッド名を「 :@@@ 」のようにした場合には通常の演算子と同様に演算子の前のオブジェクトがレシーバーになる。



0 件のコメント:

コメントを投稿