みなさん、継承についてはよくご存知のはずです。
サブクラスで基底クラスと同じ名前のメソッドを定義すると、サブクラスのメソッドが呼び出されます。
では、サブクラスで規定クラスと同じ名前の定数を定義するとどうなるでしょうか?
結果
FOO
のように定数を直接参照するとメソッドが定義されたクラスの定数が参照されます。
self.class::FOO
のように参照すると、selfのクラス(子クラス)の定数が参照されます。
class Parent
FOO = "parent"
def refer_foo
FOO # 常に Parent::FOO に解決される
end
def refer_self_class_foo
self.class::FOO # 常に Parent::FOO または Sub::FOO に解決される
end
end
class Sub < Parent
FOO = "sub"
end
puts "refer_foo"
p Parent.new.refer_foo # => "parent"
p Sub.new.refer_foo # => "parent"
puts "refer_self_class_foo"
p Parent.new.refer_self_class_foo # => "parent"
p Sub.new.refer_self_class_foo # => "sub"