Prefix Operations
クラスやTraitに、
def unary_<演算子(- or + or ! or ~)> = ...
のようなメソッドを定義しておくと、
<演算子> <レシーバ>
の形式でメソッドを呼び出すことができます。
// テスト用クラス class Foo( value:Int ) { override def toString = value.toString // unary_<演算子> で 「<演算子> <レシーバ>」で実行できる関数を定義できる。 def unary_- = new Foo( value-1 ) def unary_+ = new Foo( value+1 ) } var foo = new Foo(10) println(foo) // 「<演算子> <レシーバ>」で関数を実行。 println( + foo ) println( - foo )
実行結果です。
10 11 9
if文とかで使う「&&」とか「||」がBooleanのメソッドであるのと同じで、否定も「オブジェクトのメソッド」として実現されているわけですね。ふむ。