This is something that has been bugging me for a while. When I see any Ruby method printed in text, it usually appears as:
Class#method
or
#method
Now, I would use:
Class.method
Why are all Ruby methods preceded by a pound sign? Is there any reason for it? Just curious.
From the rdoc docs:
Names of classes, source files, and any method names containing an underscore or preceded by a hash character are automatically hyperlinked from comment text to their description.
(Emphasis added.)
Note that the convention is:
Class#method
rather than
object#method
In code you would have object.method
, if object
was an instance of class
. The #
convention is not used in code.
From the RDoc documentation:
Use :: for describing class methods, # for describing instance methods, and use . for example code.
The # notation is used to refer to the canonical instance
method, like String#upcase
. The . notation is used to refer to the method of a particular instance, like mystring.upcase
. The distinction is made to not imply that a class method 'upcase' exists.
I just realized that none of the other answers touch the most trivial aspect of the question: why the #
sign?
I have two theories:
- It might come from Smalltalk, where symbols are written
#sym
(instead of:sym
) as they are in Ruby. So, if you want to refer to a Method object (as opposed to calling a method), then you would call something likeArray >> #new.
(The>>
is itself a method that returns the method passed to it. So, in Ruby that would beArray.method :new
.) In Smalltalk documentation, methods are generally referred to asClass>>method
, but in RubyClass:method
would have made more sense, except that it is easily confused withClass::method
. Therefore,Class#method
was chosen. - My other theory is that it simply was chosen because
#
is the comment character in Ruby.
A definitive answer can only be given by whoever invented that convention. If it was invented for the Programming Ruby book, that would be either Dave Thomas or Andy Hunt, but I kind of doubt that. The book came out in 2001, Ruby started in 1993, how were they referring to methods before then?
All the answers above you list are correct. The one thing I would add is that the documentation style you said you would perfer
Class.method
would be easily confused with class methods. Since you can call class methods in ruby using the above syntax:
class Foo
def self.say_hi
puts "hi"
end
end
Foo.say_hi # => prints "hi"
This was mentioned in the JS version of this question, but it seems likely this nomenclature came from JavaDoc where the hash mark is translated directly into an on-page reference, e.g. href="Component.html#getComponentAt(int, int)"
heff's answer (which I can't comment on due to lack of reputation), that Ruby followed JavaDoc's example, is the best guess in my view. The JavaDoc designers needed or wanted a way to distinguish package qualifiers (which they used the dot for) from class qualifiers (which they used the hash for). JavaDoc's @see and @link tags syntax looks like this:
@see package.class#member [optional label]
{@link package.class#member [optional label]}
See the documentation of JavaDoc's package.class variant of the @see tag and the documentation of JavaDoc's @link tag, which heff already pointed to.
In JavaDoc, the package name can often be omitted, so that only the Class#member part remains, which looks equally strange as in Ruby, because Java code uses the Class.member syntax, just as Ruby does.
It would be interesting to find out why the JavaDoc designers needed the differing syntax, while the Java compiler does fine with dots for both purposes.
来源:https://stackoverflow.com/questions/736120/why-are-methods-in-ruby-documentation-preceded-by-a-hash-sign