Подтвердить что ты не робот

Почему методы в документации Ruby предшествуют знаку хэша?

Это то, что меня раздражало какое-то время. Когда я вижу какой-либо метод Ruby, напечатанный в тексте, он обычно выглядит как:

Class#method

или

#method

Теперь я бы использовал:

Class.method

Почему всем методам Ruby предшествует знак фунта? Есть ли причина для этого? Просто любопытно.

4b9b3361

Ответ 1

Из rdoc docs:

Имена классов, исходных файлов и любые имена методов, содержащие подчеркивание или , которому предшествует хеш символ автоматически гиперссылки из текста комментария в их описание.

(Акцент добавлен.)

Ответ 2

Обратите внимание, что соглашение:

Class#method

а не

object#method

В коде у вас будет object.method, если object был экземпляром class. Соглашение # не используется в коде.

Из документация RDoc:

Используйте:: для описания методов класса, # для описания методов экземпляра и использования. например код.

Ответ 3

Обозначение # используется для обозначения канонического метода instance, например String#upcase.. нотация используется для обозначения метода конкретного экземпляра, например mystring.upcase. Различие заключается в том, что не следует, что существует метод класса "верхний регистр".

Ответ 4

Я просто понял, что ни один из других ответов не затрагивает самый тривиальный аспект вопроса: почему знак #?

У меня есть две теории:

  • Это может происходить из Smalltalk, где символы пишутся #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 году, как раньше они ссылались на методы?

Ответ 5

Все приведенные выше ответы верны. Единственное, что я хотел бы добавить, это то, что в стиле документации, о котором вы говорили, вы будете перенести

Class.method

будет легко путать с методами класса. Поскольку вы можете вызвать методы класса в ruby, используя приведенный выше синтаксис:

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

Foo.say_hi    # => prints "hi"

Ответ 6

Это упоминалось в версии JS этого вопроса, но, похоже, эта номенклатура пришел из JavaDoc, где хеш-метка переводится непосредственно в ссылку на странице, например href="Component.html#getComponentAt(int, int)"

Ответ 7

Ответ 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 отлично справляется с точками для обеих целей.