2009-04-09 21 views
53

這是一直困擾着我的東西。當我看到在文本打印任何Ruby方法,它通常表現爲:爲什麼Ruby文檔中的方法前面有散列符號?

Class#method 

#method 

現在,我會用:

Class.method 

爲什麼所有的Ruby方法前面加一個英鎊符號?有什麼理由嗎?只是好奇。

+0

它什麼時候追溯到何時? – nafg 2016-11-02 05:19:39

回答

14

rdoc docs:類,源文件

名稱,和 含有 下劃線或由哈希 字符前面任何方法名自動 從註釋文本超鏈接到他們的 描述。

(着重號。)

95

注意到,公約是:

Class#method 

而不是

object#method 

在代碼中你會object.method,如果object是的class一個實例。代碼中不使用#約定。

the RDoc documentation

使用::用於描述描述實例方法和使用類方法,#。例如代碼。

+0

是的,對不起,班#方法。謝謝。 – 2009-04-09 23:57:45

+1

我知道#並未在代碼中使用,但它爲什麼被使用? – 2009-04-09 23:58:49

+0

該鏈接似乎已生鏽,但引用了足夠的內容以讓我找到當前源:http://ruby-doc.org/documentation-guidelines.html – 2011-10-03 18:21:07

7

上述所有你的答案列出正確。有一兩件事我想補充的是,你說的文檔的風格,你會perfer

Class.method

將與類的方法很容易混淆。既然你可以使用上述語法調用類的方法在紅寶石:

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

Foo.say_hi # => prints "hi" 
27

的#符號被用來指規範instance方法,像String#upcase。這個。符號用於指代特定實例的方法,如mystring.upcase。這種區分並不意味着存在一個類方法'upcase'。

17

我剛剛意識到,沒有其他答案觸及問題的最微不足道的方面:爲什麼#標誌?

我有兩個理論:

  1. 它可能來自Smalltalk中,其中符號都寫入#sym(而不是:sym),因爲它們是在Ruby中。所以,如果你想的方法對象(相對於調用的方法),那麼你會打電話像Array >> #new.(該>>本身就是返回傳遞給它的方法等。因此,在紅寶石這將是Array.method :new。)在Smalltalk中的文檔,方法通常被稱爲Class>>method,但在紅寶石​​會更有意義上,不同之處在於它與Class::method容易混淆。因此,選擇了Class#method
  2. 我的另一個理論是,它只是被選中,是因爲#是在Ruby中的註釋字符。

一個明確的答案只能由誰發明了一種慣例給出。如果有人發明了編程紅寶石書,這將是要麼戴夫·托馬斯或安迪·亨特,但我有點懷疑。這本書出版於2001年,Ruby於1993年開始,他們在那之前是如何提到方法的?

1

heff的答案(我不能評論,因爲缺乏聲譽),Ruby遵循JavaDoc的例子,是我認爲最好的猜測。 JavaDoc設計者需要或需要一種方法來從類限定符(他們使用散列)中區分程序包限定符(它們使用點)。 JavaDoc中的@see和@link標籤語法如下:

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

JavaDoc's package.class variant of the @see tag文檔和JavaDoc中的@link標籤,這heff已經指出的文檔。

在JavaDoc中,包名通常可以省略,所以只剩下Class#成員部分,這看起來與Ruby相同,因爲Java代碼像Ruby一樣使用Class.member語法,即 。

找到爲什麼JavaDoc設計者需要不同的語法會很有趣,而Java編譯器在兩個目的上都可以很好地使用點。

相關問題