5
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?

More than 1 year has passed since last update.

Rubyの定数探索をめっちゃ間違えるので勉強した

Last updated at Posted at 2023-08-30

定数の探索には2種類ある

  • 継承チェーンを利用した探索
  • レキシカルスコープチェーンを利用した探索

継承チェーンを利用した探索

動き

  1. クラス内を参照
  2. クラス内に参照するものがない場合には親クラスに参照しにいく

これを参照できる定数が見つかるまで繰り返します。

class ParentClass
  CONSTANT = 'constant in ParentClass'
end

class ChildClass < ParentClass
  p CONSTANT
end

上記のコードを例にして考えると、

  1. ChildClassクラスに定数の呼び出しがあるため、ChildClassクラス内を探索
  2. ChildClassクラスには定数がないので、親クラスのParentClassクラス内を探索
  3. そこに定数があったのでそれを参照

レキシカルスコープチェーンを利用した探索

レキシカルスコープはクラスや関数の定義時にスコープが決まる。

レキシカルスコープチェーンを理解するには以下の二つを押さえる必要があるらしい。

  • nd_next
  • nd_class

ndってなんの略だろう、、、

nd_nextとは

nd_nextは、親のレキシカルスコープを保持しているポインタ。通常のクラスを作成した場合は、トップレベルのスコープが保持される。

nd_classとは

nd_classは、スコープに対応するクラスやモジュールの情報を保持しているポインタ。

動き

  1. nd_classを利用してスコープに対応するクラスorモジュールを参照する
  2. クラスかモジュールが保持する定数テーブルに参照したい定数があるか確認する。
  3. 参照するものが見つからない場合は、nd_nextポインタを利用して親のレキシカルスコープに参照しに行く

参照できるものが見つかるまで上記を繰り返し行う。

module NameSpace
  CONSTANT = 'constant in NameSpace'

  class ParentClass
    class ChildClass
        p CONSTANT
    end
  end
end

上記のコードを例にして考えると、

  1. ChildClassクラスで定数の呼び出しが行われる。
  2. ChildClassクラスには定数がないので、一つネストを下げてParentClassクラスを探索する。
  3. そこにもないので、さらにネストを下げてNameSpaceモジュール内を探索する。
  4. そこに定数が定義されていたのでそれを参照する。

優先されるのは?

以上の二つで優先されるのは、レキシカルスコープチェーンを利用した探索である。

class ParentClass
  CONSTANT = 'constant in ParentClass'
end


module NameSpace
  CONSTANT = 'constant in NameSpace'

  class ChildClass < ParentClass
    p CONSTANT
  end
end

上記のようなコードの場合、NameSpaceモジュール内に定義された定数が参照される。
NameSpaceモジュール内に定数が定義されていなかった場合、親クラスへ探索をしに行くため、ParentClassクラスに定義された定数が参照される。

まとめ

定数の参照では以下の二つの探索方法によって探索が行われる。
ただし、優先されるのはレキシカルスコープチェーンである。

  • 継承チェーンを利用した探索
  • レキシカルスコープチェーンを利用した探索

また、ここでは解説しなかったが、includeやprependによってMix-inされたモジュールの中に定義された定数は参照されることはない。

5
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
5
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?