9

たとえば、 と呼ばれるメソッドは常に見てきましたString#splitが、 はまったくString.split論理的ではないようです。または、の名前空間にいるString::splitと見なすことができるため、 . クラスが想定/暗示されている場合( )、メソッドだけを見たこともあります。#splitString#split

これが ri でのメソッドの識別方法であることを理解しています。どっちが先だった?

これは、たとえば、メソッドとフィールドを区別するためですか? また、これがインスタンス メソッドとクラス メソッドを区別するのに役立つと聞いたことがあります。しかし、これはどこから始まったのでしょうか?

4

2 に答える 2

8

違いは、メソッドへのアクセス方法を示しています。

クラス メソッドはセパレータを使用し::てメッセージをクラス/モジュール オブジェクトに送信できることを示し、インスタンス メソッドはセパレータを使用#してメッセージをインスタンス オブジェクトに送信できることを示します。

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

彼らが選んだ具体的な理由と::#::慣習的に名前空間を分離していたので、私には理にかなっていますが、#おそらく他の命名法では使用されておらず、インスタンスとメソッドの区切り記号として明確に認識できる単なる記号でした。

于 2010-06-26T12:32:54.783 に答える
3

これが ri でのメソッドの識別方法であることを理解しています。どっちが先だった?

はい、ここから来ました。を使用する#と、メソッドが自動的にハイパーリンクされるため、ドキュメント内の他のメソッドへの参照には、#記号の接頭辞が付けられるようになりました。ここを参照してください:

クラス、ソース ファイル、およびアンダースコアを含むかハッシュ文字が前に付いたメソッド名の名前は、コメント テキストからそれらの説明に自動的にハイパーリンクされます。

ただし、実際にはこの方法でメソッドを呼び出すことはできません。しかし、それは驚くべきことではありません。結局、<cref ...>有効なドキュメント タグであるにもかかわらず、C# では無効なステートメントです。

于 2010-06-26T12:45:16.993 に答える