kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

Scalaの落とし穴(1) - 整数リテラルに対するメソッド呼び出し

「最近、Scalaという新しい言語が注目されているらしい。ちょっと試してみるか」という人が、Scalaでは全ての値がオブジェクトであり、演算子の呼び出しも単なるメソッド呼び出しのシンタックスシュガーであるというような説明を聞いて、よくはまる落とし穴(ブログなどを見ると、時々はまってる人を見かける)。以下のコードは、整数1に対して2を引数に取る+メソッドを呼び出している(つもり)なのだが、実際に実行してみると、3.0と表示されてしまう。

println(1.+(2)) // 1 + 2と同じ意味なので、3が表示されるはず?

Scalaでは、Javaなどと同じく、1.が浮動小数点数リテラルとして扱われるため、上のコードは、実際には、

println((1.) + (2)) //1.0に対する + メソッドの呼び出し

として解釈されてしまう。意図通りに動かすには、

println((1).+(2))

のように、レシーバの整数リテラルを()で囲んであげる必要がある(レシーバが整数リテラルでなければ、必要無いが)。

追記:
SiroKuroさんのはてぶコメントより

1 .+(2) とかは? scala やったことないので検証できないけど。

確かに、これでもOKですね。