RailsのActiveRecordのクラス名と同名のModule作ったときに誤動作するけど、どういう原理なのかというメモ
環境
$ ruby -v ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16]
要約
::
から始まる場合は一番上位のレベルを指すため、module内などで使う場合にモジュールの絶対的な位置を表現することができる。
例
moduleなどで名前空間を区切らないクラスがあるとする
class Hoge def initialize p "root hoge" end end
これに対し、同名のクラスを持つが、moduleで囲まれたものがあるとする
module AAA class Hoge def initialize p "in module hoge" end end end
このmoduleのなかで Hoge.new
とすると…
class Hoge def initialize p "root hoge" end end module AAA class Hoge def initialize p "in module hoge" end end Hoge.new end
$ ruby example.rb "in module hoge"
となり、module内のHogeが呼ばれる。
この場合にmodule外のHogeを呼びたい場合は以下のように書く。
class Hoge def initialize p "root hoge" end end module AAA class Hoge def initialize p "in module hoge" end end ::Hoge.new end
$ ruby example.rb "root hoge"