クラス定数とは
アルファベット大文字 ([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などを使って対応する。
おまけ:モジュールとクラスの違い
クラスはオブジェクトを作れる。モジュールはオブジェクト作れない。逆に共通点はメソッドを置くことはできる。