【Ruby】三項演算子で分岐処理をスマートに実装しよう

Rubyを使ったプログラミングにおいて、分岐処理を実装したいのであれば、ifやelse、caseなどのキーワードを使うのがオーソドックスな方法です。しかし、単純な分岐処理であれば、ifやelseを使うよりもさらに簡潔に実装できる方法が存在します。それが、今回紹介する三項演算子です。

今回は、三項演算子を使って分岐処理をスマートに実装する方法をサンプルコード付きで詳しく解説します。三項演算子をマスターできれば、可読性を意識したコーディングができるようになるので、ぜひ参考にしてください。

なお、Rubyの魅力や特徴については以下の記事で詳しく解説していますので、こちらもぜひご覧くださいね。

おすすめ記事

みなさんこんにちは! 今回の記事は、 悩みを抱えた人 ・Rubyってどんなプログラミング言語なの?・Rubyを勉強すると将来役に立つかな?・Rubyのおすすめの学習方法が知りたい! というお悩みを解決する記事にな[…]

Rubyとは?その特徴や将来性、おすすめの学習方法まで網羅的にご紹介します

フリーランス案件を探すならこのエージェント!

運営会社 レバテック株式会社 株式会社Branding Engineer 株式会社Hajimari
対応エリア 東京・神奈川・埼玉・千葉
大阪・兵庫・京都・愛知・福岡
東京・神奈川・埼玉・千葉
大阪・兵庫・京都・奈良・和歌山・滋賀
東京・神奈川・埼玉・千葉
茨城・大阪・兵庫・福岡
案件数 約28,000件 約3,300件 約4,200件
平均単価 68.2万円 72.2万円
最高月収 145万円 200万円 176万円
特徴高単価な案件が多い
福利厚生サービスが受けられる
・首都圏の案件が中心
給与保証制度で安定した収入を得られる
・税務処理のサポートあり
・マージン率は実質20%
週2/週3の案件が多い
在宅/リモート案件が多い
・スタートアップ企業やベンチャー企業の案件が多い
紹介企業例 ・株式会社Gunosy
・株式会社バンダイナムコホールディングス
・株式会社ユーザベース
・Sansan株式会社
・株式会社一休
・株式会社FiNC Technologies など
・クックパッド株式会社
・株式会社カオナビ
・株式会社Kaizen Platform など
説明記事
公式サイト


転職を考えているならこのエージェント!

運営会社 レバテック株式会社 株式会社Branding Engineer 株式会社リブセンス
対応エリア 東京・神奈川・埼玉・千葉
大阪・兵庫・京都・愛知・福岡
東京・神奈川・埼玉・千葉
大阪・兵庫・京都・奈良・和歌山・滋賀
東京・神奈川・埼玉・千葉
茨城・大阪・兵庫・福岡
案件数 約13,000件 約800件
※非公開求人が多い

※ドラフト制のため、対象外
年齢層 20代:◎
30代:〇
40代:〇
20代:〇
30代:〇
40代:△
20代:〇
30代:〇
40代:〇
特徴エンジニア・デザイナーを専門としている
・カウンセリングに時間をかける
年収アップ率60%の実績
IT/Web/ゲーム業界専門の転職エージェント
・業界経験者がキャリアコンサルタントを務める
・丁寧なカウンセリングで入社後の離職率1%以下を実現
ドラフト制による採用を叶える特殊なサービス
スキル・経験重視で評価してもらえる
・他エンジニアの入札結果を見ることで
自分の市場価値が分かる
紹介企業例 ・サイボウズ株式会社
・株式会社サイバーエージェント
・Chatwork株式会社 など
・DMM.com
・Money Forward
・SmartHR など
・メルカリ
・ZOZOテクノロジーズ
・freee など
説明記事
公式サイト



三項演算子とは?

三項演算子とは、Rubyで用意されている式の1つです。名前の通り、3つの項を2つの記号でつなぎ合わせたような構造になっており、if・elseを使用した分岐処理と同じような機能を持つのが特徴です。

三項演算子は、複数行に及ぶ分岐処理をたった1行で記述できるのが大きなメリットです。そのため、大量に記載されているif・elseに対して、適宜三項演算子を適用することで、ソースコードの見栄えを良くすることができます。

三項演算子の使用方法

ここからは、三項演算子の使用方法について説明します。

例として、テストの点数が赤点(30点以下)であるか否かを判定し、フラグを設定するプログラムを考えてみましょう。

「テストの点数が30点以下であるか」をプログラムの分岐条件と考えることができるので、if・elseを使用して分岐処理を実装するのが最もスタンダードな方法ですが、ここでは三項演算子を使って実装してみます。

以下のサンプルコードをご覧ください。

# テストの点数
test_score_list = {
  'test taro' => 100,
  'test hanako' => 90, 
  'test jiro' => 30,
  'test emi' => 10
}

# 赤点フラグ(true:赤点、false:赤点ではない)
red_point_flag = {}

for name, score in test_score_list do
  red_point_flag.store(
    name,
    score <= 30 ? true : false # 三項演算子による分岐処理
  )
end

red_point_flag.each { |name, flag|
  p name + ":" + flag.to_s
  # "test taro:false"
  # "test hanako:false"
  # "test jiro:true"
  # "test emi:true"
}

名前とテストの点数をハッシュとして持つ変数test_score_listを利用して、名前と赤点であるか否かの情報をハッシュで保存するプログラムを実装しています。

ポイントとなるのは15行目です。store()メソッドは、ハッシュに新たに要素を追加する機能を持ちます。今回は、赤点であればtrue、そうでなければfalseを値として追加したいので、事前に赤点であるか否かを判定する必要があります。

今回は、赤点であるか否かを判定する処理として、三項演算子を利用しました。三項演算子は、「条件式 ? 真である場合の処理 : 偽である場合の処理」の構造をしており、条件の真偽によってコロンの右側と左側で処理が分岐します。

これを利用して、赤点であればtrue、赤点でなければfalseを、store()メソッドの引数に指定しています。

三項演算子とif・elseの違い

前節で示したサンプルコードは、三項演算子による分岐処理を実装しました。再度、store()メソッドの部分のみを示します。

red_point_flag.store(
  name,
  score <= 30 ? true : false # 三項演算子による分岐処理
)

一方、if・elseを使った場合は、以下のようなソースコードになります。

if score <= 30 then
  flag = true
else
  flag = false
end

red_point_flag.store(name, flag)

メソッドの引数部分にif・elseを記述することは不可能なため、メソッド呼び出し前に分岐処理を実装しています。また、三項演算子の場合と異なり、メソッドの引数に設定するための一時的な変数flagを新たに定義しています。

三項演算子と比較すると、if・elseは処理が複数行に及ぶうえ、一時的な変数を用意しなければならず、可読性や冗長性に欠けているのが気にかかります。一方、三項演算子は分岐処理自体は1行で収まっており、変数も用意する必要がありません。

ただし、三項演算子は処理が二方向に分岐する場合のみ適用でき、三方向以上分岐するようなケースでは適用できません。したがって、分岐処理を実装する場合は、処理が何方向に分岐するのかを検討したうえで、三項演算子を適用するか、今まで通りif・elseを適用するかを決めるように心がけましょう。

三項演算子の応用テクニック

ここからは、三項演算子を利用する際に便利な応用テクニックを紹介します。

式の途中で改行する

三項演算子は1行で分岐処理を表現できるのがメリットです。しかし、記述量が多いとソースコードが横に伸びてしまい、かえって可読性を損ねるおそれがあります。その場合は、適宜改行をしましょう。

以下のサンプルコードをご覧ください。

# 現在時刻取得
now_time = Time.now

# 時刻区分(am または pm)取得
time_div = now_time.strftime("%P")

time_div == "am" ?
  p ("現在、午前" + now_time.strftime("%-I時%-M分") + "を回っております。") 
  : p ("現在、午後" + now_time.strftime("%-I時%-M分") + "を回っております。")

現在時刻を取得し、午前か午後かを判定しつつコンソール上に時刻を出力するプログラムです。

午前・午後の判定処理において三項演算子を利用していますが、同時にコンソール出力処理も行っています。1行で記述できる三項演算子の特性上、出力する文字列が長いとプログラムが横に伸びてしまうため、適宜改行することで整えています。

ただし、改行する際ははてなマークの直後で改行するようにしましょう。はてなマークの直前で改行すると、条件式と分岐後の処理が別々の文と解釈されるためです。

三項演算子を入れ子にする

三項演算子の分岐後の処理部分に三項演算子を混ぜることもできます。以下のサンプルコードは、テストの点数毎にA~Dの成績を求めるプログラムです。

test_score = 71

# 三項演算子を入れ子にすることも可能
grades = test_score <= 60 ? # 60点以下はD
  "D" :
  test_score <= 70 ? # 70点以下はC
  "C" :
  test_score <= 80 ? # 80点以下はB
  "B" :
  "A"  # 81点以上はA

p "点数:#{test_score}点 成績:#{grades}" # "点数:71点 成績:B"

成績はA~Dの4つのため、条件式が複数考えられます。if・elseで実装することも可能ですが、上記サンプルコードのように三項演算子を複数入れ子にして、複数の条件を表現できます。

ただし、条件式の数が多くなるほど、三項演算子ではかえって可読性を落としかねません。したがって、三項演算子の入れ子は乱用しないように気をつけましょう。

お仕事の途中ですが、少し一休みして、転職独立について考えてみませんか🙌?

現役エンジニアが選ぶおすすめの転職エージェント11選【成功談・失敗談もあります】

レバテックフリーランスの評判ってどう?【現役エンジニアが徹底解説します】

MidWorks(ミッドワークス)の評判ってどう?【現役エンジニアが徹底解説します】

日々の業務に追われて自分を見失わないよう、
定期的にキャリアを振り返るようにしておきましょう🤲

最後に

さて、ここまでRubyでの三項演算子の使い方やその応用方法について解説してきましたがいかがでしたか?

使いこなせると非常に便利な三項演算子ですが、便利だからと言って何度もネストしてしまうと可読性がガクッと落ちてしまいます。

これはあくまで私見ですが、三項演算子のネストは一回限りにしておきましょう。それさえ守れば、実際の開発でもバンバン活躍してくれるはずです。

このブログを通じて少しでも「傍(はた)を楽(らく)にする」ことができていれば嬉しく思います。

最後まで読んで頂きありがとうございました。