Blogaomu

WEBアプリケーション開発とその周辺のメモをゆるふわに書いていきます。

ネストしたクラス定義のメモ

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

よく考えてみれば「そりゃそうだよな」という話なんですが、気付けて良かったです(^^;;)。