Ruby 入門

Ruby 条件ステートメント

条件ステートメントは、プログラムに「ディシジョンメイキング(意思決定)」の能力を与え、特定の条件が true(真)か false(偽)かに基づいて、異なるコードブロックを実行することを可能にします。

本章では、Ruby において条件ロジックを実装するためのコアツールである ifelsif、および else ステートメントについて深く探求します。

1. if ステートメント:条件付きでコードを実行する

最もベーシックな条件ステートメントは if ステートメントです。これは、指定された条件が true である場合にのみ、内部のコードブロックを実行します。

age = 20

if age >= 18
  puts "あなたはすでに成人しています。"
end

コード解析:

  • age = 20:数値 20 をバリアブル(変数) age にアサイン(代入)します。
  • if age >= 18age の値が 18 以上であるかどうかをチェックします。20 は 18 より大きいため、この条件は true になります。
  • puts "あなたはすでに成人しています。":条件が true であるため、この行のコードが実行され、コンソールにテキストがプリント(出力)されます。
  • end:このキーワードは、if コードブロックの終了をマークします。

もし条件が false の場合、if コードブロック内部のコードは完全にスキップされます。

age = 16

if age >= 18
  puts "あなたはすでに成人しています。"
end
# 条件 (age >= 18) が false であるため、ここでは何もアウトプットされません。

1.1 if ステートメントのバリアント(シングルライン・モディファイア)

非常にシンプルな if ステートメントに対して、Ruby はステートメント・モディファイア(statement modifier)と呼ばれる極めてコンサイス(簡潔)な記述フォーマットを提供しています。

age = 25
puts "投票資格を満たしています" if age >= 18  # "投票資格を満たしています" をプリント

これは以下の記述と完全に等価です:

age = 25
if age >= 18
  puts "投票資格を満たしています"
end

このシングルライン・モディファイアは、条件付きで実行すべきコードが1行しかないシナリオに非常に適しており、ロジックを一目で理解できるようにし、コードのリーダビリティ(可読性)を大幅に向上させます。

2. else ステートメント:オルタナティブ(代替案)を提供する

else ステートメントは if ステートメントの自然な拡張です。これは、if の条件が false であった場合に専用で実行される、オルタナティブなコードブロックを提供します。

temperature = 15

if temperature > 20
  puts "外はとても暖かいです。"
else
  puts "少し肌寒いです。"
end

コード解析:

  • temperature = 15:バリアブルに 15 をアサインします。
  • if temperature > 20:温度が 20 より大きいかをチェックします。15 は 20 より大きくないため、条件は false となります。
  • puts "少し肌寒いです。"if の条件が false であるため、プログラムは if ブロックをスキップし、代わりに else ブロックを実行して「少し肌寒いです。」とプリントします。

3. elsif ステートメント:マルチプルな条件をハンドリングする

elsif ステートメント("else if" のショートハンド)は、複数の条件をシーケンシャル(順番)にチェックすることを許可します。これにより、より複雑なディシジョンメイキングのシナリオをハンドリングする利便性が提供されます。

score = 75

if score >= 90
  puts "優秀!"
elsif score >= 80
  puts "非常に良い!"
elsif score >= 70
  puts "良好。"
else
  puts "改善が必要です。"
end

コード解析:

  • if score >= 90:スコアが 90 以上であるかをチェックします。結果は false です。
  • elsif score >= 80:続いてスコアが 80 以上であるかをチェックします。結果は false です。
  • elsif score >= 70:さらにスコアが 70 以上であるかをチェックします。結果は true になります(75 は 70 より大きいため)。
  • puts "良好。":この行のコードが実行され、「良好。」とプリントされます。

注意: いずれか1つの条件が true になった時点で、残りの elsif または else ブロックはすべて完全にスキップされます。

3.1 elsif の重要な注意事項

  • シーケンシャルな評価: elsif の条件はトップダウンで1つずつチェックされます。最初に true となった条件が対応するコードブロックをトリガーし、残りの条件はすべてイグノア(無視)されます。
  • 無制限の数: あらゆるケースをチェックするために、任意の数の elsif ステートメントを記述することができます。
  • フォールバック(兜底)スキーム: else ステートメント(存在する場合)は「フォールバック」としての役割を果たし、先行するすべての if および elsif の条件が false であった場合にのみ実行されます。

4. ロジカルオペレーターを使用した条件のコンバイン

ロジカルオペレーター(論理演算子)を使用することで、複数のエクスプレッション(式)をコンバインし、より複雑な判定条件を構築することができます。

  • && (ロジカル AND): すべてのエクスプレッションが true である場合にのみ、条件全体が true になります。
  • || (ロジカル OR): 少なくとも1つのエクスプレッションが true であれば、条件全体が true になります。
  • ! (ロジカル NOT): エクスプレッションの値を反転させます。エクスプレッションが true の場合、! を付加すると false になり、逆もまた同様です。

&& (AND) のサンプル:

age = 25
has_license = true

if age >= 18 && has_license
  puts "あなたには運転する資格があります。"
else
  puts "あなたには運転する資格がありません。"
end

ここでは、年齢が 18 以上であり、かつ運転免許証(has_license)を所持しているという要件を同時に満たす必要があるため、「あなたには運転する資格があります。」がプリントされます。

|| (OR) のサンプル:

is_weekend = true
is_holiday = false

if is_weekend || is_holiday
  puts "今日は休日です!"
else
  puts "仕事に行く時間です。"
end

この例では、is_holiday は false ですが、is_weekend が true であるため、条件全体が成立し、「今日は休日です!」とプリントされます。

! (NOT) のサンプル:

is_raining = false

if !is_raining
  puts "散歩に出かけましょう!"
else
  puts "家で本を読みます。"
end

ここで is_raining 自体は false ですが、! を付加して反転させることで true になるため、「散歩に出かけましょう!」をプリントする処理が実行されます。

5. ネストされた条件ステートメント

if ステートメントを他の if ステートメントの内部にネスト(入れ子に)することで、より複雑に絡み合ったディシジョンツリーを構築することができます。ただし、過度なネストはコードのリーダビリティとメンテナンス性を著しく低下させるため、注意が必要です。

age = 60
country = "CN"

if country == "CN"
  if age >= 60
    puts "中国において、高齢者向け福祉を受給する資格を満たしています。"
  else
    puts "中国において、まだ高齢者向け福祉を受給する資格を満たしていません。"
  end
else
  puts "高齢者向け福祉の受給資格は国によって異なります。"
end

この例では、外側の if ステートメントがまず country が "CN" であるかをチェックします(※注:元のチュートリアル解説文にあった "USA" の論理的矛盾をコードに合わせて修正しています)。それが true である場合のみ、内側の if ステートメントが age をチェックし、該当国の福祉受給資格を満たしているかどうかを判定します。