わりとめんどいし汚い感じある。Module で説明するが Class も全く同様。
m = Module.new do
HOGE = 1
self::FUGA = 2
def self.test; FUGA end
def self.test2; self::FUGA end
end
p HOGE
=> 1
p m::HOGE
=> error
p m::FUGA
=> 2
p m::test
=> error
p m::test2
=> 2
潔癖症のあなたが隠蔽を完全にするためには、馬鹿馬鹿しいが以下の方法がある。
m = Module.new do
module self::Hoge
FUGA = 1
def self.test; FUGA end
end
end
p m::Hoge::FUGA
=> 1
こうすると self::
をつけ忘れる恐怖からあなたは解放され、かつ、 Hoge
モジュールには m
以外から到達不能なので隠蔽の目的は果たされる。
(module定義の所で self::
忘れるとトップレベルに Hoge
が漏洩して残念なことになる)
別の馬鹿馬鹿しい方法として以下がある。
module Hoge
FUGA = 1
def self.test; FUGA end
end
m = Hoge
self.class.send(:remove_const, :Hoge)
p m::Hoge::FUGA
=> 1
p Hoge::FUGA
=> error
まあここまで頑張ってみたところで ObjectSpace から辿れば参照できるわけで、完璧な隠蔽など不可能なのだが、そもそもなんで無名モジュールを使いたがっているかというと、隔離された名前空間で rake task を登録したいという需要があるため。
see: http://qiita.com/kuboon/items/26e90800856863c64cdc
いっそランダム文字列の module でも宣言したほうがスマートかもわからん。