Rubyの定数探索についての質問です。以下のようなコードで、
ruby
1class M 2 CONST = "Hello, world" 3end 4 5class M 6 def self.say 7 CONST 8 end 9end 10 11p M.say # "Helo,world"
この標準出力が可能なのはなぜなのでしょうか。
自分の考え
Rubyの定数探索は「1: レキシカルスコープ」を見た後で「2: 継承チェーン」を上に遡ってみていくと思います。
標準出力をさせるメソッドが定義されているレキシカルスコープには定数CONSTは定義されていないと考えています。(Mクラスの定義は2回行われていますが、一回目の定義と再定義では異なる「レキシカルスコープ」だと認識しています。)
また、Mクラスで定義したメソッドは特異メソッドであり、MクラスそのものではなくMのメタクラス(?)である#<Class:M>
に所属するメソッドになると思います。
#<Class:M>
とMクラスは「クラス-オブジェクト」の関係ではあれど、「スーパークラス-子クラス」の関係ではないため、#<Class:M>
からMクラスに定義されている定数CONSTを参照することは出来ないと思っています。
よって「レキシカルスコープ」にも「スーパークラス」にも存在しない定数を見つけ出すことは出来ないはず。
...と考えているのですが、実際のところ参照出来てしまうので、どちらかの考え方(レキシカルスコープの認識か特異クラスと特異メソッドの認識)が誤っているのだろうとは思っていまるのですが、どちらが誤りなのか、それとも他に重大な勘違いをしているのかよくわかっていません。
どの考え方が誤っているのかご教示いただけませんでしょうか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/05 04:44
2019/12/05 04:53