エルビス演算子はプログラミング言語によって定義が違うので、あまり言いたくない

エルビス演算子ってありますよね。"?:"で、これを90度傾けるとElvis Presleyに見えるからそう呼ばれているやつ。

Wikipediaのエルビス演算子の記事には:

左式exprLの評価結果が真と判定される場合にはその結果が、それ以外の場合には右式exprRの評価結果

と述べられている。

それとは別にNull合体演算子というのがある。これはエルビス演算子と似た挙動をするが、第1項が「真と判定される場合」ではなく、「Nullでない場合」になる。

それらを踏まえて、主要なプログラミング言語ごとに「偽と判定される(Falsy)場合に第2項を返す」と「Nullの場合に第2項を返す(Null合体演算子)」ための演算子をまとめてみた。

プログラミング言語 Falsyの場合、第2項を返す Nullの場合、第2項を返す(Null合体演算子
Swift なし ??
Kotlin なし ?:
Ruby or, || なし
Perl or, || //
Python or なし
PHP ?: ??
JavaScript or, || なし

SwiftとKotlinはFalsyという概念がない(Booleanのfalseのみ条件判断に用いることが出来る)ため、「Falsyの場合、第2項を返す」ということが出来ないのは納得がいく。しかし、KotlinはNull合体演算子エルビス演算子であり、本来のエルビス演算子の挙動と異なる。ここ混乱ポイントな気がする。

他の言語はFalsyという概念があり、大体orで代用するのだが、PHPはorが返す値が0/1になってしまうので、エルビス演算子が導入されている。反対に、Null合体演算子の方が用意されていないことが多い。ただし、Null条件演算子Rubyの"&."とか)などがあり、そちらを使ってくださいね、というのが多い印象。

ここからは憶測だが、エルビス演算子("?:")というのは、PHPのために生まれた演算子な気がする。実際調べるとPHPの文脈で用いられていることが多い。故にエルビス演算子 = ?: = Falsyの場合、第2項を返すという定義になった。

しかし、KotlinがNull合体演算子として"?:"を採用し、これが表層としてPHPエルビス演算子に合致してしまったため、PHPとKotlinでエルビス演算子の定義が違う、ということになっている。個人的にはエルビス演算子という名前と由来がキャッチーなので、記憶に残りやすいのも一因?

この辺はなんか見た目によって命名するのではなく、機能によって命名しろ、みたいな話とかに通じる気がする。CSSでredと命名すると、フォントカラーを青にしたとき齟齬が生じるから、titleと機能によって名前付けた方が良いよね、みたいな。

何が悪いと言うつもりもないが、思ったこととしては:

かなあ。