Документация для API функций может быть описана в коде с помощью комментариев перед определением самих функций.
По умолчанию все публичные методы, макросы, типы и константы являются основной частью API документации.
Несколько строк комментариев объединяются в единый блок.
Пустая строка разрывает отношение между комментарием и функцией.
Первый параграф комментария описывает самую суть (назначение, функционал).
Подробности и примеры использования описываются в других параграфах.
Например:
Содержимое, заключённое в апострофы, будет автоматически преобразовано в ссылки на соответствующий функционал.
Функции в текущем, документируемом, пространстве имён могут быть доступны с помощью относительных имён:
Перегрузка операторов может быть идентифицирована полным описанием метода:
Если не указан язык, то предполагается, что это
Чтобы обозначить код как текст, нужно соответствующим образом его тегировать.
Тегировать можно любым другим языком.
Чтобы показать значение выражения внутри блока с кодом, используй
Опциональный символ
Компилятор может сам добавлять некоторые слова-предупреждения в комментарии:
Директива должна располагаться на отдельной строке, но дополнительная документация может быть добавлена на другой строке.
Директива
Приватные и защищённые функции всегда скрыты.
Эта директива должна быть расположена на первой строке в комментарии.
Ведущий пробел опционален. Следующие строки с комментариями могут использоваться для внутренней документации.
Например:
Документация для
Дочерний метод может использовать
Например:
Результат для
По умолчанию все публичные методы, макросы, типы и константы являются основной частью API документации.
С помощью командыcrystal docs
можно сгенерировать сайт с API документацией.
Ассоциации
Комментарии для документации должны располагаться перед определением функции.Несколько строк комментариев объединяются в единый блок.
Пустая строка разрывает отношение между комментарием и функцией.
Ruby:
# Этот комментарий существует сам по себе
# Первая строка документации для класса Unicorn.
# Вторая строка документации для класса Unicorn.
class Unicorn
end
Форматирование
Поддерживается форматирование комментариев с помощью Markdown.Первый параграф комментария описывает самую суть (назначение, функционал).
Подробности и примеры использования описываются в других параграфах.
Например:
Ruby:
# Возвращает кол-во рогов у единорога.
#
# Всегда возвращает `1`.
def horns
1
end
Разметка
Ссылки
Ссылаться на другие API функции можно с помощью апострофа`
.Содержимое, заключённое в апострофы, будет автоматически преобразовано в ссылки на соответствующий функционал.
Ruby:
class Unicorn
# Создаёт экземпляр класса `Unicorn`
def initialize
end
end
- Методы экземпляра класса описываются как
#horns
- Методы класса описываются как
.new
- Константы и типы описываются своим именем
Unicorn
Unicorn#horns
, Unicorn.new
, Unicorn::CONST
.Перегрузка операторов может быть идентифицирована полным описанием метода:
.new(name)
, .new(name, age)
.Параметры
Ссылаясь на параметры, рекомендуется делать их наклонным шрифтом с помощью*
.
Ruby:
# Создаёт единорога с указанным кол-ом рогов (*horns*).
def initialize(@horns = 1)
raise "Не единорог" if @horns != 1
end
Примеры кода
Примеры кода располагаются в блоках кода Markdown.Если не указан язык, то предполагается, что это
Crystal
.
Ruby:
# Пример:
# ```
# unicorn = Unicorn.new
# unicorn.horns # => 1
# ```
class Unicorn
end
Ruby:
# Вывод:
# ```plain
# "Я единорожка"
# ```
def say
puts "Я единорожка"
end
Чтобы показать значение выражения внутри блока с кодом, используй
# =>
Ruby:
1 + 2 # => 3
Unicorn.new.speak # => "Я единорожка"
Предупреждения
Несколько ключевых слов-предупреждений используется для визуальной подсветки проблем, заметок и/или каких-то вопросов.- BUG
- DEPRECATED
- EXPERIMANTAL
- FIXME
- NOTE
- OPTIMIZE
- TODO
- WARNING
Опциональный символ
:
желателен для повышения читабельности.
Ruby:
# Пусть единорог говорит в STDOUT
#
# NOTE: Обычно единороги не говорят, но этот особенный
# TODO: Проверить спит ли единорог. Выбросить исключение, если не может говорить
# TODO: Создать другой метод `speak`, который принимает на вход строку и печатает её
def speak
puts "Я единорожка"
end
# Пусть единорог говорит в STDOUT
#
# DEPRECATED: Используй `speak`
def talk
puts "Я единорожка"
end
Компилятор может сам добавлять некоторые слова-предупреждения в комментарии:
- Аннотация
@[Deprecated]
добавляетDEPRECATED
. - Аннотация
@[Experimental]
добавляетEXPERIMENTAL
Директивы
Директивы указывают генератору документации, как интерпретировать документацию для определённых функций.ditto
Если 2 последовательные функции имеют одинаковое описание,:ditto:
может использоваться для копирования комментария из предыдущего определения.
Ruby:
# Возвращает кол-во рогов.
def horns
horns
end
# :ditto:
def number_of_horns
horns
end
Директива
:ditto:
заменяется содержимым предыдущего комментария.nodoc
Публичные функции могут быть скрыты из документации API с помощью директивы:nodoc:
.Приватные и защищённые функции всегда скрыты.
Ruby:
# :nodoc:
class InternalHelper
end
Ведущий пробел опционален. Следующие строки с комментариями могут использоваться для внутренней документации.
inherit
См. `Наследование документации`Наследование документации
Если метод экземпляра класса не имеет комментария, но у родительского класса есть метод с такой же сигнатурой, документация наследуется из родительского метода.Например:
Ruby:
abstract class Animal
# Возвращает имя для `self`
abstract def name : String
end
class Unicorn < Animal
def name : String
"единорог"
end
end
Unicorn#name
будет следующей:
Код:
Description copied from class `Animal`
Возвращает имя для `self`.
Дочерний метод может использовать
:inherit:
для принудительного копирования родительского комментария без "Description copied from ...".:inherit:
так же может использоваться для вставки родительского комментария в качестве дополнения к текущему.Например:
Ruby:
abstract class Parent
# Некоторая общая информация для каждого *id*.
abstract def id : Int32
end
class Child < Parent
# Некоторая специфичная информация для *id* внутри `Child`.
#
# :inherit:
def id : Int32
-1
end
end
Результат для
Child#id
:
Код:
Некоторая специфичная информация для *id* внутри `Child`.
Некоторая общая информация для каждого *id*.
Наследование документации работает только для экземпляров класса.
Полный пример
Ruby:
# Единорог это **легендарное животное** (смотри модуль `Legendary`), который
# был описан в античные времена как существо с длинным, закрученным
# рогом, растущим из его лба.
#
# Создать единорога:
#
# ```
# unicorn = Unicorn.new
# unicorn.speak
# ```
#
# Результат вызова метода:
#
# ```text
# "Я единорожка"
# ```
#
# Проверить кол-во рогов можно с помощью `#horns`.
class Unicorn
include Legendary
# Создать единорога с указанным кол-ом рогов (*horns*).
def initialize(@horns = 1)
raise "Не единорог" if @horns != 1
end
# Возвращает кол-во рогов у единорога
#
# ```
# Unicorn.new.horns # => 1
# ```
def horns
@horns
end
# :ditto:
def number_of_horns
horns
end
# Пусть единорог говорит в STDOUT
def speak
puts "Я единорожка"
end
# :nodoc:
class Helper
end
end