記事内にはプロモーションが含まれています

Rubyの三項演算子とは?if文との違いや使いどころ

Rubyの三項演算子とは?if文との違いや使いどころ プログラミングの疑問解決

年収アップの可能性を10秒チェック

現在、年収アップ額を算出中...
期待できる年収アップ額 --万円

年収アップが期待できるおすすめエージェント

Rubyでコードを書いていると、条件によって変数の中身を切り替えたい場面が山ほど出てきます。

僕が現場で新人のコードレビューをしていた頃、単純な値の代入なのに5行も6行もかけてif文を書いているのを見て、「ここ、三項演算子で1行にまとめられるよ。その方が読みやすいからね」と指摘したことが何度もあります。

しかし、この三項演算子は使いどころを間違えると、一気に「解読不能なクソコード」に成り下がる諸刃の剣でもあります。

長年、保守性の高いコードと戦い続けてきた僕の視点から、Rubyの三項演算子の「正しい使い方」と「絶対にやってはいけない地雷」を徹底解説します。

【著者プロフィール&本記事の信頼性】
プロフィール
  • 著者は元エンジニア
  • 大手プログラミングスクールのWebディレクター兼 ライターを経験
  • 自らも地元密着型のプログラミングスクールを運営
著者

【スクール選びで後悔したくない方へ】

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 / elsecase文を使いましょう。

コードの短さよりも、「他人が読んで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らしいエレガントなコードが書けるようになりたい」と感じているなら、独学で悩むより、現役エンジニアのレビューを受けられるスクールで「現場の感覚」を吸収するのも近道ですよ。

おすすめエージェント
当ブログ著者
当ブログ著者
\ 登録・利用はすべて完全無料! /
未経験からのエンジニア転職を成功させたい
ユニゾンキャリア
実務未経験エンジニアでも希望の転職先を見つけやすい!!

スキルを活かして副業で稼ぎたい
MidWorks(ミッドワークス)
週1~3日からできる副業案件多数!!

フリーランスとして高単価な案件を獲得したい
レバテックフリーランス
フリーランス案件の単価の高さは圧倒的!!
著者

【スクール選びで後悔したくない方へ】

4年連続で人気No.1となっている「RUNTEQ」は、当ブログで調査した数多くのスクールの中でも大変おすすめです。なぜ選ばれ続けているのか、 その理由や受講生の評判については、以下の記事で詳しくまとめています。

※直接公式サイトを確認したい方はRUNTEQ公式サイトからどうぞ。