Ruby でクラスをネストしようとしてハマったのでメモ。以下のようなネストしたクラスを作ろうとしていました。
hoge.rb
class Hoge end
hoge/fuga/huge.rb
class Hoge::Fuga::Huge end
この2つのファイルを作成して Hoge::Fuga::Huge を呼び出そうとすると、NameError: uninitialized constant Hoge::Fuga
となってしまいます。
クラス/メソッドの定義 を読めば分かるのですが、::
を使った書き方は外側のクラスがすでに定義されていないと使えません。上の例で言うと、Hoge::Fuga
が既に定義されていないとこの書き方は使えないということです。なので以下のようにすれば解決します。
class Hoge class Fuga class Huge end end end # もしくは class Hoge::Fuga class Huge end end
よく考えてみれば「そりゃそうだよな」という話なんですが、気付けて良かったです(^^;;)。