読者です 読者をやめる 読者になる 読者になる

Rubyのアクセス演算子'.'と'::'の違いと使い分けの考察

基本

Rubyにはモジュールなどのプロパティにアクセスするのに...の2つの演算子があります。例えば、

module Hoge
  def self.huga
  end
end

なら、Hoge::hugaに対して

Hoge.huga
Hoge::huga()

の2通りの書き方が出来ます。

.::の違い

マニュアルにちゃんと書いてありました。

`.' と `::' とはほぼ同じ意味です。但し、定数を表す場合は、 `::' を使わなければいけません(例: Math::PI)。逆に、

Klass::Foo

とした場合、常に定数と見なされるという制限があります。 `::' を、クラスメソッド呼び出しに使うという流儀がありますが、 この点は要注意です。大文字で始まるメソッド名を使用する場合は

Klass.Foo

と `.' を使うか、

Klass::Foo()

と括弧でメソッド呼び出しであることを明示する必要があります。

http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fcall.html

定数の時は必ず::。それ以外の時は.を使っておけば100%大丈夫そうです。

使い分け:オブジェクトかネームスペースか

定数の時以外は、どちらも使えることになっていますが、なんとなく使い分けたほうが良いかもなと感じています。その時のオレオレ基準*1をメモしておきます。

今のところ、基本的に、オブジェクトかネームスペースかの違いで区別しています。

  • メソッドの時はオブジェクト(レシーバ)のプロパティとみなして.を使います。
  • 定数の時はRubyの制約上迷わず::。レシーバに意味が無いので妥当でしょうか。
  • module内のクラスは、moduleがネームスペースなので::Rubyリファレンスでもそのような扱いだと思います。

コードでいえば

module Hoge

  HUGA = 1

  def self.huga
  end

  class Huga
  end

end

に対して

Hoge::HUGA
Hoge.huga
Hoge::Huga.new

といった感じです。

*1:Ruby歴1ヶ月の現時点での