違いは、メソッドへのアクセス方法を示しています。
クラス メソッドはセパレータを使用し::
てメッセージをクラス/モジュール オブジェクトに送信できることを示し、インスタンス メソッドはセパレータを使用#
してメッセージをインスタンス オブジェクトに送信できることを示します。
Complex
違いを示すために (Ruby 1.9 の) クラスを選択します。と の両方がComplex::rect
ありComplex#rect
ます。これらのメソッドには異なるアリティがあり、まったく異なる目的を果たします。 Complex::rect
は実数と虚数の引数を取り、 の新しいインスタンスを返します。Complex
一方Complex#rect
、インスタンスの実数と虚数のコンポーネントの配列を返します。
ruby-1.9.1-p378 > x = Complex.rect(1,5)
=> (1+5i)
ruby-1.9.1-p378 > x.rect
=> [1, 5]
ruby-1.9.1-p378 > x.rect(2, 4) # what would this even do?
ArgumentError: wrong number of arguments(2 for 0)
from (irb):4:in `rect'
from (irb):4
from /Users/mr/.rvm/rubies/ruby-1.9.1-p378/bin/irb:17:in `<main>'
.
すべての区切り記号として使用しない理由は、メソッドがクラスに属しているかインスタンスに属しているかがあいまいになるためだと思います。Ruby でこれを行うことに慣れた今では、正直に言うと、これは他の言語の慣習の欠点だと思います。
また、これはフィールドとはまったく関係のないトピックです。公開されているフィールドのように見えても、送信できるすべてのメッセージは正しく言えばメッセージであるためです。フィールドに最も近いものは、もちろん、属性またはインスタンス変数です。これらには常に接頭辞が付けられ、継承または/を使用しない限り、インスタンスの外部から直接@
アクセスすることはできません。Object#instance_variable_get
_set
彼らが選んだ具体的な理由と::
は#
? ::
慣習的に名前空間を分離していたので、私には理にかなっていますが、#
おそらく他の命名法では使用されておらず、インスタンスとメソッドの区切り記号として明確に認識できる単なる記号でした。