RHGの逆襲 第12回

VM のブロック呼び出しについてと定数の検索について。

できたらあとでまとめる。とりあえずほーっと思ったところだけ。

定数の名前空間の検索って実体が持ってるモジュールのネスト関係とは関係なく構文上のスコープで決まるんですよね。こういうのをlexicalなスコープっていうのかな。

つまり

module A
  B = :Const_B
end

module A
  p B   # => :Const_B
  module C
    p B # => :Const_B
  end
end

module A::C
  p B    # => NameError 発生
end

ネストしたモジュールを"::"で直接開くと、外のモジュールの定数が見えないんですよね。
これは時々うっかりまちがってしまって現象としては知ってましたが、実装を少し覗きました。
素人考えだと、この挙動を行なうほうが大変そうなので、実体に即した検索したほうが良かったりはしないんでしょうかね。