Rubyで列挙型の書き方

Rubyで列挙型の書き方

Rubyで列挙型を定義するためには、enumという概念はRubyには存在しませんが、同様の機能を提供するためにいくつかの方法があります。
以下に代表的な方法を説明します。

1. Module と Hash を使った方法

Rubyでは、列挙型を模倣するためにModuleとHashを組み合わせて使用することができます。
以下はその例です。

module Status
  PENDING = 'pending'
  APPROVED = 'approved'
  REJECTED = 'rejected'

  def self.all
    [PENDING, APPROVED, REJECTED]
  end

  def self.valid?(status)
    all.include?(status)
  end
end

この方法では、Statusモジュール内で定数を定義し、それを列挙型のように扱います。
allメソッドで全ての値を取得し、valid?メソッドで値の検証を行います。

2. Struct を使った方法

Structクラスを使って列挙型を作成する方法もあります。
Structは簡単にクラスを定義できるクラスで、特にデータの集まりを表現する際に便利です。

Status = Struct.new(:value) do
  VALID_STATUSES = ['pending', 'approved', 'rejected']

  def self.valid?(status)
    VALID_STATUSES.include?(status)
  end

  def initialize(value)
    raise ArgumentError, "Invalid status" unless self.class.valid?(value)
    super(value)
  end
end

この方法では、Structを使ってStatusクラスを定義し、コンストラクタで値が有効かどうかを確認しています。

3. Enumライブラリを使った方法

Rubyにはenumという標準ライブラリはありませんが、enumerizeなどのGemを使用することで列挙型の機能を簡単に利用できます。
例えば、enumerize Gemを使った例は以下の通りです。

# Gemfileに以下を追加
# gem 'enumerize'

require 'enumerize'

class Status
  extend Enumerize

  enumerize :state, in: { pending: 'pending', approved: 'approved', rejected: 'rejected' }
end

この方法では、enumerize Gemを使って列挙型を定義します。
enumerizeは列挙型の機能を提供し、コードの可読性と管理性を向上させます。

4. Case と Hash を使った方法

もう一つの方法として、case文とHashを組み合わせて列挙型を扱う方法があります。

class Status
  STATUSES = {
    pending: 'pending',
    approved: 'approved',
    rejected: 'rejected'
  }

  def self.all
    STATUSES.values
  end

  def self.valid?(status)
    STATUSES.value?(status)
  end
end

この方法では、STATUSESというHashを用いて列挙型の値を管理し、allメソッドやvalid?メソッドで値の確認を行います。

結論

Rubyで列挙型を表現するには、いくつかの方法があり、それぞれに利点があります。
ModuleとHashを使う方法はシンプルで標準的ですが、Structを使う方法やenumerize Gemを使う方法はより多機能で柔軟性があります。
状況に応じて最適な方法を選択すると良いでしょう。