Rubyの三項演算子(?:)の使い方を徹底解説!基本構文から注意点まで
Rubyの三項演算子とは?
三項演算子は「3つの部分」で構成される演算子で、「三項(ternary)」という名前もここから来ています。具体的には、条件式と2つの結果候補から成り立ちます。
つまり、三項演算子を使えば、通常複数行になるif/else文をたった1行のコンパクトなコードにまとめられるのです。
例えば、次のようなコードが…
if apple_stock > 1 :eat_apple else :buy_apple end
このように書けます:
apple_stock > 1 ? :eat_apple : :buy_apple
これが三項演算子の力です。
では、具体的にどのように動作するのか、正しい構文はどうなっているのかを見ていきましょう。
三項演算子を書くためのテンプレート
三項演算子の構文を汎用化すると、「空欄を埋めるだけ」のシンプルなテンプレートになります。
次のような形です:
condition ? true : false
最初の部分は条件式です。真偽を判定したい条件をここに書きます。
その後に疑問符(?)が続きます。
これは構文の一部であり、Rubyはこの記号によって「三項演算子が書かれている」と認識します。
次に、条件がtrueだった場合に実行したいコード、つまり1つ目の結果候補を記述します。
その後にコロン(:)が続きます。これも構文要素の一つです。
最後に、条件がfalseだった場合に実行したいコード、つまり2つ目の結果候補を書きます。
例:
"chocolate".size > 4 ? "More than four characters" : "Less than four characters"
- 条件 =>
"chocolate".size > 4 - trueの場合 =>
"More than four characters" - falseの場合 =>
"Less than four characters"
この3つの部分が、すべての三項演算式を構成する要素です。
メソッド名が疑問符で終わっている場合でも、条件と結果候補の間の?を忘れないようにしましょう。
例:
"".empty? ? "Yes" : "No"
見落としやすいポイントなので、この種のコードを書く際は特に注意が必要です。
複雑な三項演算子の注意点
三項演算子は誤って使われることもあります。
複雑な処理をさせようとした瞬間に、悪い選択肢になり始めます。
例えば、三項演算式の結果を変数に代入することは可能です。
a = 10 > 5 ? "yes" : "no"
これは問題ありません。
しかし、結果候補にスペースを含む処理を書くと、話が変わってきます。
次の例を見てください:
10 > 5 ? (puts "yes") : (puts "no")
ここでは括弧を使う必要があります。
なぜでしょうか?
括弧がないとSyntaxErrorが発生するからです。
しかし、この括弧によってコードは少し読みにくくなり、三項演算子を使うメリットである可読性やスタイルの良さが損なわれてしまいます。
三項演算子を使うかどうかを選ぶ際には、この点を念頭に置いておきましょう。
三項演算子と演算子の優先順位
三項演算式で起こりうるもう一つの問題が、演算子の優先順位です。
例を見てみましょう:
[].tap { |a| a << "ccccc".size == 0 ? "empty" : "not empty" }
# [5]
本来なら"empty"か"not empty"という三項演算子の結果のどちらかが期待されますが、実際には5が返されました。
何が起きているのでしょうか?
実は、Rubyを含むほとんどのプログラミング言語では、式がそれぞれ異なる優先度レベルで処理されます。
これは単純な四則演算でも起こります!
ご存知の通り、掛け算は足し算・引き算よりも先に評価されますよね。
同様にRubyでは、メソッド呼び出し(<<やsize)が三項演算子よりも優先されるため、先ほどの例のような挙動になります。
これは括弧で解決できます:
[].tap { |a| a << ("bbbbb".size == 0 ? "empty" : "not empty") }
# ["not empty"]
三項演算子を書く際にもう一つ覚えておきたいポイントですね。
まとめ
今回はRubyの三項条件演算子について学びました。この演算子を使えばコンパクトな条件分岐を書けますが、状況によってはコードの可読性を高めることもあれば、逆に下げてしまうこともあります。
それでは、あなたの番です!学んだことを実際に手を動かして練習し、知識をしっかりと定着させましょう。
最後まで読んでいただきありがとうございました🙂
-
Rubyのgrepメソッド徹底解説!使い方とselectとの違いを実例で学ぶ
今回はRubyのgrepメソッドについて詳しく見ていきます。 このメソッドにはどんな便利さがあるのでしょうか? grepを使えば、配列(Array)や範囲(Range)など、Enumerableモジュールを含むオブジェクトから、条件に一致する要素だけを効率よく抽出できます。 「それってselectでも同じことができるのでは?」 確かにそうですが、grepはselectとは異なる仕組みで動作し、得られる結果も異なります。この違いを理解すれば、コードをより簡潔に書けるようになりますよ。 それでは、実際の例を見てみましょう。 Ruby grepメソッドの実例集 まず、次のような配列を用意します。
-
RubyのStructとOpenStructの使い方を徹底解説!値オブジェクトを簡単に作る方法
Rubyには、関連する属性をまとめて保持する「値オブジェクト」を手軽に作れるStructという組み込みクラスが用意されています。本記事では、Structの基本的な使い方から注意点、そしてOpenStructとの違いまで詳しく解説します。 そもそもStructとは何か? StructはRubyに組み込まれたクラスで、新しいクラスを動的に生成し、値オブジェクト(Value Object)を作成するために使われます。値オブジェクトとは、関連性のある複数の属性をひとまとめにして扱うためのオブジェクトです。 具体例を挙げてみましょう。 2つの座標(xとy)を持つPointというデータを表したい場合、この