Rubyでコードを書いていると、条件によって変数の中身を切り替えたい場面が山ほど出てきます。
僕が現場で新人のコードレビューをしていた頃、単純な値の代入なのに5行も6行もかけてif文を書いているのを見て、「ここ、三項演算子で1行にまとめられるよ。その方が読みやすいからね」と指摘したことが何度もあります。
しかし、この三項演算子は使いどころを間違えると、一気に「解読不能なクソコード」に成り下がる諸刃の剣でもあります。
長年、保守性の高いコードと戦い続けてきた僕の視点から、Rubyの三項演算子の「正しい使い方」と「絶対にやってはいけない地雷」を徹底解説します。
![]() |
|
【スクール選びで後悔したくない方へ】
4年連続で人気No.1となっている「RUNTEQ」は、当ブログで調査した数多くのスクールの中でも大変おすすめです。なぜ選ばれ続けているのか、 その理由や受講生の評判については、以下の記事で詳しくまとめています。
※直接公式サイトを確認したい方はRUNTEQ公式サイトからどうぞ。
著者(元エンジニア)が語る!三項演算子の存在意義
Rubyには「同じ結果を得るための書き方が複数ある」という思想がありますが、三項演算子はその象徴的な存在です。
正式には「条件演算子」と言いますが、現場では「三項演算子」で通じます。
最大の特徴は、「if文を1行に凝縮できるシンタックスシュガー(糖衣構文)」であること。
単純に値を返したいだけの時に、わざわざif ... else ... endと書くのは、プロの目から見ると少し冗長に感じてしまいます。
三項演算子を適切に使うことで、コードのノイズを減らし、ロジックの本質を浮き彫りにすることができるのです。
三項演算子の基本構文
構文は非常にシンプルですが、最初は記号の順番で迷うかもしれません。
条件式 ? 真の場合の値 : 偽の場合の値
これをif文と比較してみましょう。
if文を使ったコード
status = 1
statusが1なら'有効'、それ以外なら'無効'を代入したい
if status == 1
label = '有効'
else
label = '無効'
end
puts label
三項演算子を使ったコード
status = 1
1行で完結。右辺の結果がlabelに代入される
label = status == 1 ? '有効' : '無効'
puts label
実行結果
どちらのコードも出力は同じです。
有効
ソースコードの解説
三項演算子では、status == 1という条件を評価し、それがtrueなら?の直後にある'有効'を返し、falseなら:の後ろにある'無効'を返します。
僕が現場でこの書き方を推す理由は、変数(label)への代入が1回で済むからです。
if文だと各ブランチの中で代入を繰り返す必要があり、タイポ(打ち間違い)によるバグの入り口を広げてしまいます。
初心者要注意!「演算優先順位」の罠
三項演算子を使い始めた頃、僕が実際に現場でやらかした「恥ずかしいバグ」を紹介しましょう。
# 本人は 'Result: OK' と表示したい
status = true
puts "Result: " + status ? "OK" : "NG"
このコード、実行するとどうなるか分かりますか?
実行結果:
OK
期待していた「Result: OK」は表示されません。
なぜなら、Rubyは+の演算を三項演算子より先に処理してしまうからです。
つまり、"Result: " + statusが先に評価され、その結果が「真」なので"OK"だけが出力されたのです。
僕の経験上、三項演算子を使う時は「カッコ()で囲む」のが最も安全な防衛策です。
puts "Result: " + (status ? "OK" : "NG")
こう書くべきでした。
実務で差が出る!想定利用シーンの具体化
三項演算子は「どこでも使えばいい」というものではありません。
現場で「あ、ここは三項演算子がベストだな」と判断する具体例を挙げます。
RailsのView(ERB)での表示切り替え
これは実務で一番よく見かけるパターンです。
<span class="badge">
<%= user.active? ? 'アクティブ' : '停止中' %>
</span>
Viewの中でif文をダラダラ書くと、HTMLの構造が見えにくくなってしまいます。
こういう時は三項演算子ですっきりさせるべきです。
メソッドの引数に条件を渡す
# プレミアム会員なら20%オフ、一般なら定価
price = calculate_price(item, is_premium ? 0.8 : 1.0)
引数の中で条件分岐を完結させることで、呼び出し側のコードをスマートに保てます。
CSV出力などのデータ成形
# booleanの結果を 'Yes' / 'No' に変換して出力
csv_row << [user.id, user.has_paid ? 'Yes' : 'No']
【警告】三項演算子のネストは「負債」でしかない
初心者が「かっこいいから」とやってしまいがちなのが、三項演算子の中にさらに三項演算子を書く「ネスト(入れ子)」です。
# 絶対にやってはいけない書き方
score = 85
result = score > 90 ? 'A' : (score > 80 ? 'B' : 'C')
きつい言葉で言うと・・・このコードは「ゴミ」です。
確かに動きますが、一瞬でロジックが理解できません。
3つ以上の条件分岐があるなら、迷わずif / elsif / elseやcase文を使いましょう。
コードの短さよりも、「他人が読んで3秒以内に理解できるか」の方が100倍重要です。
Rubyの三項演算子に関するFAQ
最後に、Rubyの三項演算子に関するFAQについて掲載していきます。
三項演算子の中でメソッドを呼び出してもいい?
動きますが、おすすめしません。
三項演算子はあくまで「値を返す」ためのものです。
user.admin? ? delete_all : notify_userのように破壊的なメソッドや複雑な処理を呼ぶと、副作用が見えにくくなります。
その場合はif文を使いましょう。
nil判定には三項演算子を使うべき?
ケースバイケースですが、もっと便利な書き方があります。
name ? name : '名前なし'という処理なら、Rubyにはname || '名前なし'という、より簡潔な「自己代入/後置||」があります。
そちらもセットで覚えるべきです。
読みやすさのために三項演算子を複数行に分けてもいい?
それをやるなら最初から if 文を書きましょう。
三項演算子のメリットは「1行で完結する」ことにあります。
複数行に分ける必要があるほど複雑なら、三項演算子を使うべきタイミングではありません。
まとめ
Rubyの三項演算子は、正しく使えばコードを美しくし、間違えれば保守性を破壊するツールです。
- 単純な値の切り替えには三項演算子。
- 3つ以上の分岐や複雑な処理は
if / elsif。 - 迷ったら「カッコ」で囲んで優先順位を守る。
- ネスト(入れ子)は厳禁。
「短く書ける=すごいエンジニア」ではありません。
「読みやすいコードを書ける=プロのエンジニア」です。
この違いを意識して、三項演算子を使いこなしてください。
もし、「もっとRubyらしいエレガントなコードが書けるようになりたい」と感じているなら、独学で悩むより、現役エンジニアのレビューを受けられるスクールで「現場の感覚」を吸収するのも近道ですよ。

実務未経験エンジニアでも希望の転職先を見つけやすい!!
週1~3日からできる副業案件多数!!
フリーランス案件の単価の高さは圧倒的!!
【スクール選びで後悔したくない方へ】
4年連続で人気No.1となっている「RUNTEQ」は、当ブログで調査した数多くのスクールの中でも大変おすすめです。なぜ選ばれ続けているのか、 その理由や受講生の評判については、以下の記事で詳しくまとめています。
※直接公式サイトを確認したい方はRUNTEQ公式サイトからどうぞ。



