エルビス演算子はプログラミング言語によって定義が違うので、あまり言いたくない
エルビス演算子ってありますよね。"?:"で、これを90度傾けるとElvis Presleyに見えるからそう呼ばれているやつ。
左式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と機能によって名前付けた方が良いよね、みたいな。
何が悪いと言うつもりもないが、思ったこととしては:
かなあ。