💎

【Ruby 3日目】基本文法 - 制御構造(if/unless/case)

に公開

はじめに

Rubyの制御構造(if/unless/case)について、Ruby 3.4の仕様に基づいて詳しく解説します。基本文法の理解は、Rubyプログラミングの基礎となる重要な要素です。

この記事では、基本的な概念から実践的な使い方まで、具体的なコード例を交えて説明します。

基本概念

制御構造(if/unless/case)の主な特徴:

  • Rubyの動的な特性を活かした柔軟な記法
  • 直感的で読みやすい構文設計
  • 強力な表現力と簡潔性の両立

Rubyでは制御構造(if/unless/case)を使用することで、より効率的で読みやすいコードを書くことができます。

基本的な使い方

if文

# if文の基本
age = 20

if age >= 20
  puts "成人です"
end

# if-else
score = 75

if score >= 60
  puts "合格"
else
  puts "不合格"
end

# if-elsif-else
score = 85

if score >= 90
  puts "優秀"
elsif score >= 70
  puts "良好"
elsif score >= 60
  puts "合格"
else
  puts "不合格"
end

# 後置if(修飾子形式)
puts "成人です" if age >= 20

# 三項演算子
result = age >= 20 ? "成人" : "未成年"
puts result

unless文

# unless文(ifの逆)
logged_in = false

unless logged_in
  puts "ログインしてください"
end

# 後置unless
puts "ログインしてください" unless logged_in

# unlessにelseは使わない(可読性が下がる)
# BAD: unless logged_in; else; end

case文

# case-when文
grade = "B"

case grade
when "A"
  puts "優秀"
when "B"
  puts "良好"
when "C"
  puts "合格"
else
  puts "不合格"
end

# 複数の値をマッチング
day = "土"

case day
when "月", "火", "水", "木", "金"
  puts "平日"
when "土", "日"
  puts "休日"
end

# 範囲を使ったマッチング
score = 85

case score
when 90..100
  puts "優秀"
when 70..89
  puts "良好"
when 60..69
  puts "合格"
else
  puts "不合格"
end

# Ruby 3.0以降: パターンマッチング
value = [1, 2, 3]

case value
in [a, b, c]
  puts "3要素の配列: #{a}, #{b}, #{c}"
in [a, b]
  puts "2要素の配列"
else
  puts "その他"
end

基本的な使い方を理解したら、次は実践的なユースケースを見ていきましょう。

よくあるユースケース

ケース1: ユーザー認証チェック

実務でよく使われる認証パターンです。

class User
  attr_reader :role, :active

  def initialize(role, active)
    @role = role
    @active = active
  end

  def can_access?(resource)
    # 複合条件での制御
    if active && authorized_role?(resource)
      true
    else
      false
    end
  end

  private

  def authorized_role?(resource)
    case role
    when "admin"
      true
    when "editor"
      resource != "admin_panel"
    when "viewer"
      resource == "public_page"
    else
      false
    end
  end
end

# 使用例
admin = User.new("admin", true)
puts admin.can_access?("admin_panel")  # => true

viewer = User.new("viewer", true)
puts viewer.can_access?("admin_panel")  # => false

ケース2: バリデーション処理

入力値の検証によく使われるパターンです。

def validate_email(email)
  errors = []

  # nilチェック
  if email.nil? || email.empty?
    errors << "メールアドレスは必須です"
    return errors
  end

  # 長さチェック
  errors << "メールアドレスが長すぎます" if email.length > 255

  # 形式チェック
  unless email.match?(/\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i)
    errors << "メールアドレスの形式が正しくありません"
  end

  errors
end

# 使用例
puts validate_email(nil)              # => ["メールアドレスは必須です"]
puts validate_email("invalid")        # => ["メールアドレスの形式が正しくありません"]
puts validate_email("test@example.com")  # => []

ケース3: ステータス処理

オブジェクトの状態管理パターンです。

class Order
  attr_reader :status, :items

  def initialize
    @status = :pending
    @items = []
  end

  def add_item(item)
    if status == :pending
      @items << item
      puts "商品を追加しました: #{item}"
    else
      puts "注文が確定済みのため、商品を追加できません"
    end
  end

  def confirm
    case status
    when :pending
      if items.empty?
        puts "商品が選択されていません"
      else
        @status = :confirmed
        puts "注文を確定しました"
      end
    when :confirmed
      puts "すでに確定済みです"
    when :shipped
      puts "発送済みのため変更できません"
    end
  end

  def ship
    return puts "確定されていません" unless status == :confirmed

    @status = :shipped
    puts "発送しました"
  end
end

# 使用例
order = Order.new
order.add_item("本")
order.add_item("ペン")
order.confirm
order.ship

注意点とベストプラクティス

注意点

  • パフォーマンス: 大量のデータを扱う場合は、パフォーマンスに注意
  • エラーハンドリング: 適切な例外処理を実装する
  • 可読性: コードの意図が明確になるよう、適切な命名を心がける

ベストプラクティス

  • Ruby 3.4の最新機能を活用する
  • テストコードを書いて動作を保証する
  • ドキュメントコメントを適切に記述する
  • Rubyコミュニティの規約に従う
  • 必要に応じてリファクタリングを行う

Ruby 3.4での改善点

Ruby 3.4では、以下の点が改善されています:

  • パフォーマンスの最適化
  • より直感的なAPI
  • エラーメッセージの改善

実践的なサンプルコード

実際のプロジェクトで使える、より実践的な例です。

# プロダクションレベルの実装例

class Example
  def initialize
    # 初期化処理
  end

  def process
    # メイン処理
    # 制御構造(if/unless/case)を活用した実装
  end

  private

  def validate
    # バリデーション処理
  end
end

# 使用例
example = Example.new
example.process

デバッグとトラブルシューティング

よくある問題と解決方法:

問題1: 期待した結果にならない

原因: 型やスコープの誤解
解決: pppで中間結果を確認

問題2: パフォーマンスが悪い

原因: 非効率なアルゴリズム
解決: プロファイリングツールで特定し最適化

まとめ

この記事では、制御構造(if/unless/case)について以下の内容を学びました:

  • 制御構造(if/unless/case)の基本概念と重要性
  • 基本的な使い方と構文
  • 実践的なユースケースとパターン
  • 注意点とベストプラクティス
  • Ruby 3.4での改善点

制御構造(if/unless/case)を理解することで、より効率的で保守性の高いRubyコードを書けるようになります。

次のステップ

さらに学習を深めるために:

  • 公式ドキュメントで詳細な仕様を確認
  • 実際のプロジェクトで実装してみる
  • 関連する機能も合わせて学習
  • コミュニティのベストプラクティスを参照

参考資料

Discussion