ruby クラス定数

2022.07.28

クラス定数とは

アルファベット大文字 ([A-Z]) で始まる識別子は定数です

Ruby 3.0.1

以下が定数。

class Hoge
 A = "おはよう"
 Ab = "こんにちは"
 a = "こんばんは"
end

p Hoge.const_get(:A) #=> おはよう
p Hoge.const_get(:Ab) #=> こんにちは
p Hoge.const_get(:a) #=> wrong constant name a (NameError)

特徴

定数は子孫クラスでも使える。子孫クラスで定数を書き換えると子孫クラスでは書き変わるが親クラスでは描き変わらない。

class Hoge
 A = "Japan"
end

class Hoge2 < Hoge
 A = "NewZealand"
end

p Hoge.const_get(:A) #=> Japan
p Hoge2.const_get(:A) #=> NewZealand
p Hoge.const_get(:A) #=> Japan

トップレベルに定数を定義するとObjectクラスの定数となる。

A = "japan"
class Hoge
 def country
  p Object::A
 end
end

Hoge.new.country #=> japan
p A.class.superclass #=> Object
p Object.constants #=> [..略.., :A, ..略..]

まとめ

クラス定数はA~Zの大文字で始めて定義する。トップレベルに定義した場合はObjectクラスの定数となる。

値の書き換えができるのでfreezeなどを使って対応する。

おまけ:モジュールとクラスの違い

クラスはオブジェクトを作れる。モジュールはオブジェクト作れない。逆に共通点はメソッドを置くことはできる。