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

  • 2021年7月17日
  • 2021年10月16日
  • Ruby

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

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

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

おすすめ記事

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

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

レバテックフリーランス … 業界最大級の案件数業界トップクラスの高単価報酬を誇る最大手のサービスです。実績豊富なコーディネーターが丁寧な対応をしてくれるため、案件の無理な提案はありません。フリーランスで生きていくためにはまず登録しておきましょう。
MidWorks … フリーランス賠償責任保障生命保険の折半など、フリーランスでありながらも正社員並みの保障を受けられるのが特徴です。また、経験豊富なキャリアコンサルタントによる手厚いサポートも受けられるため、安定したフリーランス生活を送りたい方には特におすすめのサービスです。
ポテパンフリーランス … IT業界・技術に詳しいコンサルタントが担当してくれるため、こちらの要望をきちんと理解した上で案件を紹介してくれます。また、案件情報のみならず、フリーランスのイロハについても教えてくれるため、フリーランスとして初めて活動される方には特におすすめのサービスです。

レバテックキャリア … ITエンジニアが利用したい転職エージェントNo.1にも選ばれており、年収600万円以上のハイクラス求人を5,000件以上も保有しています。エンジニアが転職を考えた時にまず初めに登録しておくべきサービスです。
Tech Stars Agent … Tech Stars Agentでは、担当エージェントが全員エンジニア出身のため、スキルやキャリアを見据えたきめ細かな転職支援が受けられます。運営元の株式会社Branding Engineerは、独立支援サービス「MidWorks」も展開しているため、独立を視野に入れたサポートも受けられます
転職ドラフト … 年収UP率93.8%/平均年収UP額126万円と圧倒的な年収UP率を誇るイベント型のエンジニア向け 転職サービスです。毎月1回開催され、厳選された優良IT/Web系企業約150社からダイレクトスカウトを受け取ることができます。年収アップを目指す方は登録必須です。


三項演算子とは?

三項演算子とは、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での三項演算子の使い方やその応用方法について解説してきましたがいかがでしたか?

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

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

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

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