Kotlinでは行先頭に+-演算子を書いてはいけない理由
Kotlinは分からないことが沢山です。
Javaと互換性があるしAndroid Studioでは相互変換できる機能もあるけど、言語的にはまったく別物だなと感じることが多いです。
最近気づいたのがこんな事実
行先頭に+ー演算子を置くこと
行末尾に+ー演算子を置くこと
この2つはKotlin的には全く解釈が違うということでした。
行先頭に演算子(+-)を置かない方がいいです。
行先頭に演算子を置くと予想外の結果が?
Android Studioでコードを書いてた時です。
▼ 何気なくこんなコードを書いてしまった
val dummy = 123456789
+ 123456789123456789
+ 123456789123456789
+ 123456789123456789
+ 123456789123456789
Javaに慣れてると何の問題もなく思えます。
というかJava以外でもこういう書き方をしがちです。
ところがAndroid Studioが警告を出してきます。
▼ Android Studioで実際に表示されたもの
「Unused unary operator」
使用されていない単一演算子…
そして結果も 123456789 が代入されていました。
どうやら行先頭の演算子はKotlin的には意味がないみたいです。
なぜUnused unary operatorで解釈されるのか
その理由はKotlinがコンマを強制しないからです。
コンマがない場合はKotlinが気を利かせて補正します。
そのため、コンマの有無により解釈の差が生じるという理由。
▼ 先ほどのコードをもう一度掲載
val dummy = 123456789
+ 123456789123456789
+ 123456789123456789
+ 123456789123456789
+ 123456789123456789
▼ Kotlinはこう解釈する
val dummy = 123456789;
+ 123456789123456789;
+ 123456789123456789;
+ 123456789123456789;
+ 123456789123456789;
コンマを書かなくていいのは便利といえば便利だけど、
こういった人間とインタプリタの解釈食い違うことも起きます。
しかもエラーも出ない警告どまりだから少し厄介ですね…
ちなみにJavaではこういう問題は発生しない
一方のJavaだとこんな問題は起きません。
▼ 先ほどのコードをJavaに直したコード
long dummy = 123456789
+ 123456789
+ 123456789
+ 123456789
+ 123456789;
System.out.println(dummy);
▼ 出力結果
617283945
Javaはコンマが必須だから、演算子が行先頭にあろうが行末尾にあろうが1つだけの意味で解釈してくれます。
ところがKotlinは柔軟性を持たせるためにコンマなしでも動く。
Javaのような厳密さがないのが少しだけ仇になったみたいです。
こういった問題はKotlinだけじゃなくてコンマ省略を許しているJavaScriptでも起きやすいですね。(ブログの方でもコンマ省略の実害とか書いた)
あとググってみても実例がヒットしにくいです。
たとえば「kotlin unused unary operator」で調べても検索結果は少数だし、コンマ省略の実害を書いているページはありません。
もしかしたら気にするまでもない初歩的な問題なのかな?
僕はそうとは思えないので、自戒の意味も込めてまとめました。
とりあえずKotlinでは行先頭に+-演算子を置くべきではありません。