web-dev-qa-db-ja.com

Rubyドキュメントのメソッドの前にハッシュ記号が付いているのはなぜですか?

これはしばらくの間私を悩ませてきたものです。 Rubyメソッドがテキストで印刷されているのを見ると、通常は次のように表示されます。

Class#method

または

#method

今、私は使用します:

Class.method

すべてのRubyメソッドの前にポンド記号が付いているのはなぜですか?理由はありますか?ただ興味があります。

56
Ed S.

rdoc docs から:

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

(強調が追加されました。)

16
Sarah Mei

規則は次のとおりです。

Class#method

のではなく

object#method

コードでは、object.methodobjectclassのインスタンスだった場合。 #規則はコードでは使用されません。

から RDocドキュメント

::を使用してクラスメソッドを記述し、#を使用してインスタンスメソッドを記述し、を使用します。たとえば、コード。

101
Simon Nickerson

#表記は、String#upcaseのような正規のinstanceメソッドを参照するために使用されます。 。表記は、mystring.upcaseなどの特定のインスタンスのメソッドを参照するために使用されます。この区別は、クラスメソッド「upcase」が存在することを意味しないように行われます。

28
dstnbrkr

他の答えのどれも質問の最も些細な側面に触れていないことに気づきました:なぜ#記号?

私には2つの理論があります:

  1. これは、Rubyの場合と同じように(#symではなく):symでシンボルが記述されるSmalltalkに由来する可能性があります。したがって、メソッドに参照呼び出しメソッドではなく)オブジェクトにしたい場合は、Array >> #new.>>は、それ自体が渡されたメソッドを返すメソッドです。したがって、RubyはArray.method :newになります。)Smalltalkのドキュメントでは、メソッドは一般にClass>>methodと呼ばれますが、Ruby Class:methodは、Class::methodと簡単に混同されることを除いて、より理にかなっています。したがって、Class#methodが選択されました。
  2. 私の他の理論は、#がRubyのコメント文字であるため、単に選択されたというものです。

決定的な答えは、その慣習を発明した人だけが与えることができます。 Programming Rubyの本のために発明されたとしたら、それはDaveThomasかAndyHuntのどちらかでしょうが、私はそれを疑っています。この本は2001年に出版され、Ruby 1993年に始まりましたが、それ以前はどのようにメソッドを参照していましたか?

18
Jörg W Mittag

上記のすべての答えは正しいです。私が追加する1つのことは、あなたが好むと言ったドキュメントスタイルです

Class.method

クラスメソッドと簡単に混同されます。上記の構文を使用してRubyでクラスメソッドを呼び出すことができるため:

class Foo
  def self.say_hi
    puts "hi"
  end
end

Foo.say_hi    # => prints "hi"
7
user89677

これは この質問のJSバージョン で言及されましたが、おそらくこの命名法 JavaDocから来た ハッシュマークがページ上の参照に直接翻訳されているようです。 href="Component.html#getComponentAt(int, int)"

3
heff

RubyがJavaDocの例に従っているという、heffの答え(評判が悪いためコメントできません)は、私の見解では最良の推測です。 JavaDocの設計者は、パッケージ修飾子(ドットを使用)とクラス修飾子(ハッシュを使用)を区別する方法を必要としていたか、望んでいました。 JavaDocの@seeおよび@linkタグの構文は次のようになります。

@see   package.class#member [optional label]
{@link package.class#member [optional label]}

@ seeタグのJavaDocのpackage.classバリアント のドキュメントと、heffがすでに指摘しているJavaDocの@linkタグのドキュメントを参照してください。

JavaDocでは、パッケージ名を省略できることが多く、Class#member部分のみが残ります。これは、JavaコードがRubyと同じようにClass.member構文を使用するため、Rubyと同じように奇妙に見えます。します。

Javaコンパイラが両方の目的でドットを使用しても問題なく動作するのに対し、JavaDoc設計者が異なる構文を必要とした理由を見つけるのは興味深いことです。

1
Rainer Blome