この記事はアピリッツの技術ブログ「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