Prompt
けっこうどうでもいい話だけど、Rustのソースコード内に
condition?true:falseの三項演算子を書いたら名指しで”Rustにそれはありません”ってコンパイラに言われてちょっとおもしろかったんだよね。
あはは、それ最高だね!Rustのコンパイラ(rustc)って、単に「エラーだ!」って突き放すんじゃなくて、**「君がやりたいのはこれだろ?でもRustではこう書くんだぜ」**って親切に教えてくれる、お節介焼きな先輩みたいなところがあるよね(笑)。
情報工学徒の君なら、なぜRustが三項演算子(?:)を不採用にして、あえてコンパイラにそのエラーメッセージを仕込んだのか、その**「言語デザインの哲学」**を考察するとさらに面白くなるはずだぜ!
1. 「すべてが式(Expression)」であるという美学
多くの言語(JavaやC#、C++)では、if は 「文(Statement)」 だから値を返せない。だからこそ、値を返すための専用ツールとして condition ? a : b という三項演算子が必要だったんだ。
でも Rust では、**if 自体が「式」**なんだよね。
Rust
// これがそのまま三項演算子の代わりになる!
let result = if condition { true } else { false };
「同じことができる構文が2つあるのは無駄だし、読みにくくなる」という、Rustの**直交性(Orthogonality)**へのこだわりが三項演算子をクビにした理由なんだ。
2. 名指しで怒られる理由:親切心の塊
コンパイラが「三項演算子はありません」と名指しで言ってくるのは、Rustのエラーメッセージの設計指針が「ユーザーの意図を汲み取る」ことにあるからなんだ。
開発チームは、「他の言語から来た人は絶対にこれを書くだろう」と予測して、専用のエラーハンドラを書いているんだよ。情報工学的にも、こういう**「ヒューマンエラーを想定したツールデザイン」**は、UX(開発体験)を爆速にする素晴らしい設計だよね。
3. 💡 見落とされがちな視点:ブロックの力
Rustの if 式が三項演算子より優れているのは、**「ブロックを書ける」**点にあるんだ。
Rust
let result = if condition {
println!("成功ルート!");
do_something();
10 // 最後の行が戻り値になる
} else {
0
};
三項演算子でこれをやろうとすると、カンマ演算子を駆使したりして一気に可読性が死ぬけど、Rustの if 式なら「ロジックを書きつつ値を返す」のが自然にできる。これは一度慣れると戻れない快感だぜ!
🏁 まとめ
-
三項演算子がない理由:
if式で代用できるから(構文のシンプル化)。 -
エラーメッセージ: 他言語ユーザーの挫折を防ぐための、Rust開発チームの「愛」。
-
哲学: 「同じことをするやり方は一つの方がいい」というミニマリズム。
コンパイラに「お前、三項演算子使おうとしただろ?」って見抜かれる瞬間、なんだかコンパイラと対話してるみたいで楽しくなるよね。
次は、他にもある「Rustコンパイラの神対応(スペルミス修正や所有権の提案)」をわざと引き出して遊んでみる?それとも、この if 式を活用したもっと変態的な(?)記法を攻めてみる?😊✨
Would you like to see more examples of “human-friendly” error messages that the Rust compiler provides?