西松です.
青木さん [ruby-list:37835] もりきゅうさん [ruby-list:37836] ありがとうございます:
まとめますと, あるクラスから見える定数は
自分で定義されたもの
その外側のクラスで定義されたもの
そのまた外側で定義されたもの(以下トップレベルまで続く、トップレベル含まない)
スーパークラスで定義されたもの
そのスーパークラスで定義されたもの(以下Objectまで続く、Object含まない)
注意1: 定数の検索は外方向に向かってのみ.
注意2: クラスでincludeされたA_Module (実質的に
SubClass < (A_Module) < SupClass という継承と等しい)
の中の定数は上記の「スーパークラスで定義されたもの」に相当★する.
注意3: トップレベル, Object での include は特殊なので,
それを一般化して考えることはできない.
でしょうか. ぼくのちと恥ずかしい例もつけておきます.
# incmod.rb
module M
ConstM = "M"
end
class Parent
ConstP = "P"
include M
p ConstP # => "P"
p M::ConstM # => "M"
p ConstM # => "M" ★
class Nested
p ConstP # => "P"
p M::ConstM # => "M"
#p ConstM # => uninitialized constant Parent::Nested::ConstM (NameError)
end
end
p Parent::ConstP # => "P"
p Parent::M::ConstM # => "M"
p Parent::ConstM # => "M"
p M::ConstM # => "M"
#p ConstM # => uninitialized constant ConstM (NameError)
include Math
p PI # => 3.14 トップレベルでincludeしたmodule中の定数
ConstT = "Top"
class C
p PI # => 3.14 トップレベルでincludeしたmodule中の定数
p ConstT # => "Top" トップレベルで定義した定数
class Cn
p PI # => 3.14 トップレベルでincludeしたmodule中の定数
p ConstT # => "Top" トップレベルで定義した定数
end
end
じつは, 青木さんの『Rubyソースコード完全解説』を読んでいて
湧いた疑問でした. ちゃんと読めていないことが発覚しましたが.
もりきゅうさんのていねいな解説でやっとぼくの誤解がとけました.
ありがとうございます.
--
love && peace && free_software
西松 毅