コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Rubyでクラス名のはじめに::(コロンを2つ)をつけるとそのクラスの絶対的な位置表現をすることができる

RailsActiveRecordのクラス名と同名のModule作ったときに誤動作するけど、どういう原理なのかというメモ

環境

$ ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16]

要約

:: から始まる場合は一番上位のレベルを指すため、module内などで使う場合にモジュールの絶対的な位置を表現することができる。

moduleなどで名前空間を区切らないクラスがあるとする

class Hoge
  def initialize
    p "root hoge"
  end
end

これに対し、同名のクラスを持つが、moduleで囲まれたものがあるとする

module AAA
  class Hoge
    def initialize
      p "in module hoge"
    end
  end
end

このmoduleのなかで Hoge.new とすると…

class Hoge
  def initialize
    p "root hoge"
  end
end

module AAA
  class Hoge
    def initialize
      p "in module hoge"
    end
  end

  Hoge.new
end
$ ruby example.rb 
"in module hoge"

となり、module内のHogeが呼ばれる。

この場合にmodule外のHogeを呼びたい場合は以下のように書く。

class Hoge
  def initialize
    p "root hoge"
  end
end

module AAA
  class Hoge
    def initialize
      p "in module hoge"
    end
  end

  ::Hoge.new
end
$ ruby example.rb 
"root hoge"

参考リンク