Ответ 1
Из rdoc docs:
Имена классов, исходных файлов и любые имена методов, содержащие подчеркивание или , которому предшествует хеш символ автоматически гиперссылки из текста комментария в их описание.
(Акцент добавлен.)
Это то, что меня раздражало какое-то время. Когда я вижу какой-либо метод Ruby, напечатанный в тексте, он обычно выглядит как:
Class#method
или
#method
Теперь я бы использовал:
Class.method
Почему всем методам Ruby предшествует знак фунта? Есть ли причина для этого? Просто любопытно.
Из rdoc docs:
Имена классов, исходных файлов и любые имена методов, содержащие подчеркивание или , которому предшествует хеш символ автоматически гиперссылки из текста комментария в их описание.
(Акцент добавлен.)
Обратите внимание, что соглашение:
Class#method
а не
object#method
В коде у вас будет object.method
, если object
был экземпляром class
. Соглашение #
не используется в коде.
Используйте:: для описания методов класса, # для описания методов экземпляра и использования. например код.
Обозначение # используется для обозначения канонического метода instance
, например String#upcase
.. нотация используется для обозначения метода конкретного экземпляра, например mystring.upcase
. Различие заключается в том, что не следует, что существует метод класса "верхний регистр".
Я просто понял, что ни один из других ответов не затрагивает самый тривиальный аспект вопроса: почему знак #
?
У меня есть две теории:
#sym
(вместо :sym
), как они есть в Ruby. Итак, если вы хотите ссылаться на объект Method (в отличие от вызова метода), вы бы назовёте что-то вроде Array >> #new.
(The >>
сам является методом, возвращающим метод, переданный ему. Итак, в Ruby это будет Array.method :new
.) В документации Smalltalk методы обычно называются Class>>method
, но в Ruby Class:method
было бы более разумно, за исключением того, что его легко путать с Class::method
. Поэтому выбрано Class#method
.#
является символом комментария в Ruby.Окончательный ответ может дать только тот, кто придумал это соглашение. Если бы это было изобретено для книги "Программирование Руби", это были бы либо Дэйв Томас, либо Энди Хант, но я как бы сомневаюсь в этом. Книга вышла в 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, это лучшее предположение на мой взгляд. Разработчики JavaDoc нуждались или хотели различать классификаторы пакетов (которые они использовали для точки) для классификаторов классов (для которых они использовали хэш для). Синтаксис синтаксиса JavaDoc @see и @link выглядит следующим образом:
@see package.class#member [optional label]
{@link package.class#member [optional label]}
См. документацию JavaDoc package.class вариант тега @see и документацию тега JavaDoc @link, на который он уже указал.
В JavaDoc имя пакета часто может быть опущено, так что останется только часть участника класса #, которая выглядит столь же странно, как и в Ruby, поскольку код Java использует синтаксис Class.member, как и Ruby.
Было бы интересно узнать, почему разработчикам JavaDoc нужен разный синтаксис, в то время как компилятор Java отлично справляется с точками для обеих целей.