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
といった感じです。