LoginSignup
4
3

More than 5 years have passed since last update.

無名モジュール定義時は全ての定数参照に self:: が必要。

Last updated at Posted at 2015-09-11

わりとめんどいし汚い感じある。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 でも宣言したほうがスマートかもわからん。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3