はじめに
三項演算子、使ってますか?
先日とうとう後輩の @miriwo 氏がめでたく三項演算子に目覚めたということで、これはめでたいということで筆を執りました。
まあ、タイトルだけ見るとエルビス演算子に目覚めたのかなって気になってましたけど。
それはそれで大変便利なのです。
三項演算子とは
例を見てみましょう。
転載元: https://chiicomi.com/smp/r_news_detail?id=19e92c3c-0b86-11e6-8bd0-a0369f7b8e6e
こちらは我らがジェフユナイテッド市原千葉のマスコット、ジェフィとユニティです。
(千葉なのに)秋田犬の双子のわんこなんですが、キャラクターデザイン上の取り計らいで、大きさと背番号以外は区別がつかないようになっています。
ある程度のレベルのジェフサポになると 「キリッとしてるほうがジェフィ、やんちゃな方がユニティ」 とか 「耳がシャキッとしてるほうがジェフィ、丸っこい耳がユニティ」 とか言い出したりするんですが、他サポからは 「ジェフサポは(いろいろな意味で)あたまがおかしい」 と思われているので聞き入れてもらえません。
なので、犬の背番号が2だったらジェフィ、2じゃなかったユニティを name
に代入するコードをJavaScriptで書いてみました。
const name = (dog.uniform_number === 2) ? 'Jefy' : 'Unity';
?
の左に判定条件、その右に判定が true
のときの値、 :
を挟んでその右が false
のときの値です。
これをたまにいる三項演算子否定派が書くとこんな感じになります。
const name = '';
if(dog.uniform_number === 2){
name = 'Jefy';
} else {
name = 'Unity';
}
長い……
要はこういうのをif文ではなく式で簡便に表現できるというのが三項演算子です。
実は本名は「条件演算子」といいます。
三項演算子は結構どの言語にも実装されています。
入れ子の三項演算子
あんまりやってはいけないのですが、三項演算子はネスト(入れ子)して書くことができます。
例を見てみましょう。
実はジェフのマスコットはジェフィとユニティのオス犬の双子だけではなく、どこからともなく現れた みなちゃん という白い雑種のメス犬もいます。写真の一番右の子ですね。
ちなみにジェフィとユニティは毎年シーズンシートを買って入っている一般サポーターらしいのですが、みなちゃんはれっきとしたジェフユナイテッド株式会社の社員です。
そんな設定の話は置いといて、みなちゃんの背番号はサポーターナンバーと呼ばれる12番です。つまりこんな感じになります。
const name = (dog.uniform_number === 2) ? 'Jefy' : (dog.uniform_number === 9) ? 'Unity' : 'Mina-chang';
どうですか? 見づらくてハゲそうですよね。
見やすくするテクニックとして、記号の前で改行するというのがあります。
外人が書くコードでよく見かけますよね。
const name = (dog.uniform_number === 2)
? 'Jefy'
: (dog.uniform_number === 9)
? 'Unity'
: 'Mina-chang';
ただ、この入れ子の三項演算子、**PHPだけなぜか動作が違います。**あいつはなぜか 右から評価 するので、カッコを使って、こんな感じに書かないと思ったとおりになりません。
$name = (dog.uniform_number === 2)
? 'Jefy'
: ( (dog.uniform_number === 9)
? 'Unity'
: 'Mina-chang');
不毛感がすごい……
※追記
@rana_kualu さんからコメントでいただきましたが、カッコを使わない三項演算子のネストはPHP7.4からは非推奨、PHP8からはエラーになるとのことです。
参考: 【PHP8.0】PHPの三項演算子が他言語の実装に一歩近付く
おわりに
三項演算子の特殊な書き方として、エルビス演算子とかnull合体演算子の話は次回書きます。
それではお元気で! Enjoy, Summer!!