Rubyの識別方法の#条約の理論的/歴史は何ですか?
-
30-09-2019 - |
質問
たとえば、私はいつもと呼ばれる方法を見てきました String#split
, 、 しかし決して String.split
, 、これは少し論理的に思えます。または多分さえ String::split
, 、あなたが考慮することができるからです #split
の名前空間にいること String
. 。クラスが想定されている/暗示されているとき、私はその方法だけを見たことさえあります(#split
).
これがRIでメソッドが特定される方法であることを理解しています。どちらが最初に来ましたか?
これは、たとえば、フィールドとの方法を区別するためですか?また、これにより、インスタンスメソッドとクラスメソッドの区別に役立つと聞きました。しかし、これはどこから始まりましたか?
解決
違いは、メソッドへのアクセス方法を示しています。
クラスメソッド 使用 ::
メッセージをクラス/モジュールオブジェクトに送信できることを示すセパレーター、そして インスタンスメソッド 使用 #
メッセージをインスタンスオブジェクトに送信できることを示すセパレーター。
私は選ぶつもりです 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
.
具体的には彼らが選んだ理由について ::
と #
? ::
それは従来の名前空間を分離しているので、私には理にかなっていますが #
おそらく、他の命名法では使用されておらず、インスタンスメソッドセパレーターとして明確に認識される可能性のあるシンボルでした。
他のヒント
これがRIでメソッドが特定される方法であることを理解しています。どちらが最初に来ましたか?
はい、これはそれがどこから来たのかです。使用するとき #
, 、それはあなたの方法を自動的にハイパーリンクするので、ドキュメントの他の方法への参照は、 #
サイン。見る ここ:
クラスの名前、ソースファイル、およびアンダースコアを含む、またはハッシュ文字が先行するメソッド名は、コメントテキストから説明まで自動的にハイパーリンクされます。
ただし、この方法で実際にメソッドを呼び出すことはできません。しかし、それは驚くべきことではありません。結局、 <cref ...>
有効なドキュメントタグであるにもかかわらず、C#の無効なステートメントです。