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 件のコメント:
コメントを投稿