その他
    ホーム技術発信DoRuby トップレベルの定数(クラス/モジュール)の取得

    [小ネタ] トップレベルの定数(クラス/モジュール)の取得

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    ネストしたクラスなどの内部からトップレベルの定数を呼び出す小ネタ

     クラスが呼び出せない!

    Rubyでは「ModuleA::ModuleB::ClassC」のようにモジュールやクラスの中に子クラスを作って名前空間をわけることができるようになっています。

    module A
      module B
        class C
          def self.test
            return B
          end
        end
      end
    end
    
    class B
    end
    

    上記コードではモジュールBとクラスBで名前が被っていますが、スコープが異なるので問題ありません。

    ここでA::B::C.testを実行すると

    モジュールA::B

    が返ってきます。

    クラスA::B::C内部からトップレベルにあるクラスBを呼び出したい場合はどうすればよいでしょうか。

     解決策

    return B
    

    としていた箇所を

    return ::B
    

    のように演算子”::”をつけて呼び出すだけです。

    設計をちゃんとしろよ、という声も聞こえてきそうですが

    依存ライブラリなどの都合で名前を変えることができないということは、よくあります。

    とはいえ同じ名前のモジュール・クラスなどの定数が散在しているのは

    混乱の元となります。

    開発する箇所ではまず、

    汎用的すぎず(重複しにくく)可読性の高い命名を心がけたいものです。

    ————–

    動作環境

    CentOS 6.3

    ruby 1.9.3p194