Rubyを使ったプログラミングにおいて、分岐処理を実装したいのであれば、ifやelse、caseなどのキーワードを使うのがオーソドックスな方法です。しかし、単純な分岐処理であれば、ifやelseを使うよりもさらに簡潔に実装できる方法が存在します。それが、今回紹介する三項演算子です。
今回は、三項演算子を使って分岐処理をスマートに実装する方法をサンプルコード付きで詳しく解説します。三項演算子をマスターできれば、可読性を意識したコーディングができるようになるので、ぜひ参考にしてください。
なお、Rubyの魅力や特徴については以下の記事で詳しく解説していますので、こちらもぜひご覧くださいね。
みなさんこんにちは! 今回の記事は、 悩みを抱えた人 ・Rubyってどんなプログラミング言語なの?・Rubyを勉強すると将来役に立つかな?・Rubyのおすすめの学習方法が知りたい! というお悩みを解決する記事にな[…]
フリーランス案件を探すならこのエージェント!
転職を考えているならこのエージェント!
三項演算子とは?
三項演算子とは、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での三項演算子の使い方やその応用方法について解説してきましたがいかがでしたか?
使いこなせると非常に便利な三項演算子ですが、便利だからと言って何度もネストしてしまうと可読性がガクッと落ちてしまいます。
これはあくまで私見ですが、三項演算子のネストは一回限りにしておきましょう。それさえ守れば、実際の開発でもバンバン活躍してくれるはずです。
このブログを通じて少しでも「傍(はた)を楽(らく)にする」ことができていれば嬉しく思います。
最後まで読んで頂きありがとうございました。