3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rubyの継承と定数を組み合わせるとどうなるか?

Posted at

みなさん、継承についてはよくご存知のはずです。

サブクラスで基底クラスと同じ名前のメソッドを定義すると、サブクラスのメソッドが呼び出されます。

では、サブクラスで規定クラスと同じ名前の定数を定義するとどうなるでしょうか?

結果

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"
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?