クラス定数はクラスの中で定義される定数で、そのクラスに関連する固定値を管理するために使います。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
タイプ: 動物子クラスSpiderでLEGSを再定義していますが、親クラスの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::PIとMath::PIのように、異なるクラスで同じ名前の定数を持てます。グローバルな定数よりもクラス定数の方が名前の衝突を避けられます。
private_constantで非公開にする
外部からアクセスさせたくないクラス定数はprivate_constant :定数名で非公開にできます。内部実装の詳細を隠蔽したい場合に活用しましょう。
まとめ
- クラス定数はクラス内で大文字から始まる名前で定義する
- 外部からは
クラス名::定数名でアクセスする - クラス定数は子クラスに継承され、子クラスで上書き可能
- 関連する設定値をクラスにまとめることでコードの整理ができる
private_constantで外部からのアクセスを制限できる