💎
【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: 期待した結果にならない
原因: 型やスコープの誤解
解決: p
やpp
で中間結果を確認
問題2: パフォーマンスが悪い
原因: 非効率なアルゴリズム
解決: プロファイリングツールで特定し最適化
まとめ
この記事では、制御構造(if/unless/case)について以下の内容を学びました:
- 制御構造(if/unless/case)の基本概念と重要性
- 基本的な使い方と構文
- 実践的なユースケースとパターン
- 注意点とベストプラクティス
- Ruby 3.4での改善点
制御構造(if/unless/case)を理解することで、より効率的で保守性の高いRubyコードを書けるようになります。
次のステップ
さらに学習を深めるために:
- 公式ドキュメントで詳細な仕様を確認
- 実際のプロジェクトで実装してみる
- 関連する機能も合わせて学習
- コミュニティのベストプラクティスを参照
Discussion