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では行先頭に+-演算子を置くべきではありません。

いいなと思ったら応援しよう!