为什么Ruby文档中的方法前面有散列符号?

这是一直困扰着我的东西。 当我看到任何用文本打印的Ruby方法时,它通常显示为:

Class#method 

要么

 #method 

现在,我会使用:

 Class.method 

为什么所有的Ruby方法都有一个磅符号? 有什么理由吗? 只是好奇。

从rdoc文档 :

类名称,源文件和任何包含下划线或以哈希字符开头的方法名称将自动从评论文本超链接到它们的描述。

(强调补充说。)

请注意,约定是:

 Class#method 

而不是

 object#method 

在代码中你将有object.method ,如果object是一个class的实例。 代码中不使用#约定。

从RDoc文档 :

使用::来描述类的方法,使用#来描述实例的方法。 例如代码。

#符号用于引用规范instance方法,如String#upcase 。 的。 符号用于指代特定实例的方法,如mystring.upcase 。 区别是不意味着类方法'upcase'存在。

我只是意识到,没有其他答案触及问题的最微不足道的方面:为什么#号?

我有两个理论:

  1. 它可能来自于Smalltalk,其中符号被写入#sym (而不是:sym ),就像它们在Ruby中一样。 所以,如果你想引用一个Method 对象 (而不是调用一个方法),那么你可以调用类似于Array >> #new.东西Array >> #new. (这个>>本身就是一个返回传递给它的方法的方法,所以在Ruby中就是Array.method :new 。在Smalltalk文档中,方法通常被称为Class>>method ,但是在Ruby Class:method会更有意义,除非它很容易与Class::method混淆。 因此select了Class#method
  2. 我的另一个理论是,它只是被选中,因为#是Ruby中的注释字符。

一个明确的答案只能由发明该公约的人给出。 如果它是为Ruby编程书而发明的,那将是Dave Thomas或Andy Hunt,但是我对此有所怀疑。 这本书在2001年出版,Ruby于1993年开始,那么他们在那之前是如何提到方法的?

上面列出的所有答案都是正确的。 我要补充的一件事就是你所说的文档风格将会延续

Class.method

很容易与类方法混淆。 既然你可以使用上面的语法在ruby中调用类方法:

 class Foo def self.say_hi puts "hi" end end Foo.say_hi # => prints "hi" 

在这个问题的JS版本中提到了这个问题 ,但是似乎这个术语来自于JavaDoc ,其中哈希标记被直接翻译成页面引用,例如href="Component.html#getComponentAt(int, int)"

heff的回答(我不能评论,因为缺乏声誉),Ruby遵循JavaDoc的例子,是我认为最好的猜测。 JavaDocdevise者需要或希望从类限定符(他们使用散列)中区分程序包限定符(它们使用点)。 JavaDoc的@see和@link标签语法如下所示:

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

请参阅JavaDoc的package.class变体的@see标记和JavaDoc的@link标记的文档,heff已经指出了这一点。

在JavaDoc中,包名通常可以省略,所以只剩下Class#成员部分,这在Ruby中看起来同样奇怪,因为Java代码使用Class.member语法,就像Ruby一样。

找出为什么JavaDocdevise者需要不同的语法是很有趣的,而Java编译器在两个目的上都可以很好地处理点。