クラス内で宣言された場合はそのクラス内がスコープになり、クラスの外で宣言された場合はObjectクラスの定数になる。
# クラスの外で宣言
HOGE = "uga"
# クラス内で定数を宣言
class Test1
HOGE = "hoge"
def initialize
p HOGE #=> hoge
end
end
# 継承した場合、定数もちゃんと継承される
class Test2 < Test1
def initialize
super #=> hoge
p HOGE #=> hoge
end
end
# 継承して同名の定数を宣言した場合は、上書きされる
# superした場合は継承元を見る
class Test3 < Test1
HOGE = "fuga"
def initialize
super #=> hoge
p HOGE #=> fuga
end
end
# 定数を宣言してない場合は、Objectの定数を見る
class Test4
def initialize
p HOGE #=> uga
end
end
真性オブジェクト指向言語を名乗る(?)だけあって、非常にイメージしやすい動き。こういうところは好きです。