基礎

Rubyのクラス定数入門|クラス内での定数定義とアクセス方法

クラス定数はクラスの中で定義される定数で、そのクラスに関連する固定値を管理するために使います。Rubyではクラス内で大文字から始まる名前を付けるだけでクラス定数を定義でき、::演算子を使ってクラスの外からもアクセスできます。この記事ではクラス定数の定義方法からアクセス方法、実践的な使い方まで解説します。

基本的な使い方

クラス定数はクラス定義の中に直接記述します。クラスの外からはクラス名::定数名の形式でアクセスします。

Ruby
class Circle
  PI = 3.14159

  def initialize(radius)
    @radius = radius
  end

  def area
    PI * @radius * @radius
  end
end

# クラスの外からアクセス
puts Circle::PI

# インスタンスメソッド内で使う
circle = Circle.new(5)
puts "面積: #{circle.area}"
実行結果
3.14159
面積: 78.53975

クラス定数PIはクラス内のメソッドから直接参照でき、クラスの外からはCircle::PIのように::(スコープ解決演算子)を使ってアクセスします。これにより、関連する定数をクラスにまとめて管理できます。

複数の定数を定義

1つのクラスに複数の定数を定義して、関連する設定値をまとめて管理できます。

Ruby
class HttpStatus
  OK = 200
  NOT_FOUND = 404
  SERVER_ERROR = 500
  MESSAGES = {
    200 => '成功',
    404 => 'ページが見つかりません',
    500 => 'サーバーエラー'
  }.freeze
end

puts HttpStatus::OK
puts HttpStatus::NOT_FOUND
puts HttpStatus::MESSAGES[404]
実行結果
200
404
ページが見つかりません

HTTPステータスコードのような固定値をクラス定数としてまとめることで、マジックナンバー(意味の分からない数値)をコード中に散らばらせることを防げます。

継承とクラス定数

クラス定数は子クラスに継承されます。子クラスで同名の定数を定義すると上書きされますが、親クラスの定数は変更されません。

Ruby
class Animal
  LEGS = 4
  TYPE = '動物'
end

class Spider < Animal
  LEGS = 8  # 親クラスの定数を上書き
end

puts "動物の足: #{Animal::LEGS}"
puts "クモの足: #{Spider::LEGS}"
puts "タイプ: #{Spider::TYPE}"  # 親クラスの定数を継承
実行結果
動物の足: 4
クモの足: 8
タイプ: 動物

子クラスSpiderLEGSを再定義していますが、親クラスのAnimal::LEGSは4のままです。また、子クラスで定義していないTYPEは親クラスから継承されてアクセスできます。

実践的な使い方

Ruby
class Config
  VERSION = '1.0.0'
  MAX_RETRY = 3
  TIMEOUT = 30
  ALLOWED_FORMATS = ['jpg', 'png', 'gif'].freeze

  def self.info
    puts "Version: #{VERSION}"
    puts "Max Retry: #{MAX_RETRY}"
    puts "Timeout: #{TIMEOUT}秒"
    puts "許可フォーマット: #{ALLOWED_FORMATS.join(', ')}"
  end
end

Config.info
puts "---"
puts "バージョン確認: #{Config::VERSION}"
実行結果
Version: 1.0.0
Max Retry: 3
Timeout: 30秒
許可フォーマット: jpg, png, gif
---
バージョン確認: 1.0.0
クラス定数とグローバル定数の違い

クラス定数はクラスに属するため名前空間が分離されます。Circle::PIMath::PIのように、異なるクラスで同じ名前の定数を持てます。グローバルな定数よりもクラス定数の方が名前の衝突を避けられます。

private_constantで非公開にする

外部からアクセスさせたくないクラス定数はprivate_constant :定数名で非公開にできます。内部実装の詳細を隠蔽したい場合に活用しましょう。

まとめ

  • クラス定数はクラス内で大文字から始まる名前で定義する
  • 外部からはクラス名::定数名でアクセスする
  • クラス定数は子クラスに継承され、子クラスで上書き可能
  • 関連する設定値をクラスにまとめることでコードの整理ができる
  • private_constantで外部からのアクセスを制限できる