文档指南

本指南讨论了在 Ruby 核心和 Ruby 标准库中记录类、模块和方法的建议。

生成文档

大多数 Ruby 文档都位于源文件中,并以 RDoc 格式 编写。

某些页面位于 doc 文件夹下,可以使用 .rdoc.md 格式编写,由文件扩展名决定。

要在 {build folder}/.ext/html 目录中生成 HTML 中文档更改的输出,请在构建目录中运行以下内容

make html

如果没有构建目录,请按照 快速入门指南 执行步骤 4。

然后,可以通过在浏览器中打开 {build folder}/.ext/html/index.html 文件来预览更改。

目标

Ruby 文档的目标是在最短的时间内传达最重要和最相关的信息。读者应该能够快速理解主题代码的用途以及如何使用它。

提供的信息太少是不好的,但提供不重要的信息或不必要的示例也不是好的。根据用户的需要来判断。

一般准则

字符

在 C 源文件中仅使用与 US-ASCII 兼容的字符。(如果你使用其他字符,Ruby CI 会温和地让你知道。)

如果想将与 ASCII 不兼容的字符放入 C 编码的类、模块或方法的文档中,可以使用涉及新文件 doc/*.rdoc 的解决方法

RDoc

Ruby 使用 RDoc 进行文档化。有关 RDoc 语法和功能的信息,请参阅 RDoc 标记参考

来自 irb 的输出

对于代码示例,请考虑使用交互式 Ruby,irb

对于包含 irb 输出的代码示例,请考虑在连续的行中对齐 # => ...。对齐有时可能有助于可读性

a = [1, 2, 3] #=> [1, 2, 3]
a.shuffle!    #=> [2, 3, 1]
a             #=> [2, 3, 1]

标题

使用 标题 来组织类或模块的冗长讨论。

不要在方法或常量的文档中使用正式标题。

在极少数情况下,需要在方法或常量的文档中使用标题状结构时,请使用 粗体文本 作为伪标题。

空行

空行开始一个新段落。

空行应该在 代码块列表 之前和之后出现。对于 HTML 输出,这是不必要的,但有助于 ri 输出。

方法名称

对于文本中的方法名称

嵌入式代码和命令

嵌入在运行文本中(即,不在代码块中)的代码或命令应该标记为 单字体

作为简单字符串的代码应该包括引号。

自动链接

通常情况下,不应抑制 RDoc 的自动链接。例如,我们应该编写 Array,而不是 \Array

我们可能会考虑在以下情况下抑制:

大多数情况下,类、模块或方法的名称将自动链接

如果没有,或者如果您抑制自动链接,请考虑强制使用 单字体

编写显式链接时,请遵循以下准则。

rdoc-ref 架构

对以下内容使用 rdoc-ref 架构

请参阅 链接 中的“rdoc-ref 架构”一节。

对以下内容使用基于 URL 的完整链接

这样做可确保即使包文档独立构建(独立于核心文档),链接仍然有效。

链接应指向 docs.ruby-lang.org/en/master/ 中的目标。

对指向站外文档的链接也使用基于 URL 的完整链接。

变量名称

变量的名称(如其调用序列中指定的)应标记为 单字体

此外,对临时变量的名称使用单字体文本(即,仅在讨论中定义和使用的变量,例如 n)。

HTML 标记

通常,避免使用 HTML 标记(即使在允许使用的格式中),因为 ri(Ruby 交互式参考工具)可能无法正确呈现它们。

表格

特别是,避免使用 HTML 标记(<table> 等)构建表格。

备选方案

记录类和模块

类或模块文档的总体结构应为

概要

概要是对类或模块的作用以及读者可能希望使用它的原因的简短描述。在概要中避免使用细节。

常见用法

展示类或模块的常见用法。根据类或模块的不同,此部分在长度和复杂性上可能会有很大差异。

此处内容摘要

类或模块的文档可能包含“此处内容”部分。

指南

记录方法

常规结构

方法文档的常规结构应为

调用顺序(对于用 C 编写的函数)

对于用 Ruby 编写的函数,RDoc 自动记录调用顺序。

对于用 C 编写的函数,RDoc 无法确定方法接受哪些参数,因此需要使用 RDoc 指令 {call-seq:}记录这些参数。

对于单例方法,请使用以下形式

class_name.method_name(method_args) {|block_args| ... } -> return_type

示例

*  call-seq:
*    Hash.new(default_value = nil) -> new_hash
*    Hash.new {|hash, key| ... } -> new_hash

对于实例方法,请使用以下形式(省略任何前缀,就像 RDoc 对 Ruby 编码方法所做的那样)

method_name(method_args) {|block_args| ... } -> return_type

例如,在 Array 中,请使用

*  call-seq:
*    count -> integer
*    count(obj) -> integer
*    count {|element| ... } -> integer
* call-seq:
*    <=> other -> -1, 0, 1, or nil

参数

返回类型

别名

概要

接下来是概要,它是对方法的作用以及您希望使用它的原因的简短描述。理想情况下,这是一句话,但对于更复杂的方法,可能需要一整段。

对于 Array#count,概要是

Returns a count of specified elements.

这很好,因为它简短且具有描述性。避免在概要中记录太多内容,坚持为读者提供最重要的信息。

详细信息和示例

大多数非平凡的方法受益于示例,以及概要中未提供的信息。在详细信息和示例部分,您可以记录方法如何处理不同类型的参数,并提供有关正确用法的示例。在此部分中,重点关注如何正确使用该方法,而不是该方法如何处理不当的参数或特殊情况。

并非方法的每种行为都需要示例。如果记录的方法返回 self,则无需提供示例来显示返回值与接收器相同。如果记录的方法返回 nil,则无需提供示例来显示它返回 nil。如果详细信息中提到对于某种参数类型,将返回一个空数组,则无需为此提供示例。

仅在示例为用户提供附加信息时添加示例,如果示例提供概要或详细信息中提供的信息,请不要添加示例。示例的目的是不证明详细信息中陈述的内容。

参数描述(如果需要)

对于需要参数的方法,如果在详细信息中没有明确提及或在示例中没有隐式显示,并且不明显,则可以提供对所支持的参数类型的详细信息。在讨论参数类型时,即使不太精确,也要使用简单的语言,例如“level 必须是整数”,而不是“level 必须是可以转换为 Integer 的对象”。绝大多数使用情况都将使用预期类型,而不是可以明确转换为预期类型的参数,记录差异并不重要。

对于采用块的方法,如果在详细信息中没有明确提及或在示例中没有隐式显示,并且不明显,则记录传递的参数类型可能很有用。

如果有多个参数或块参数,请使用 标记列表

特殊情况和异常

对于方法的特殊情况,例如非典型用法,请简要提及行为,但不要提供任何示例。

仅记录非显而易见的引发异常。例如,如果您之前已声明参数类型必须是整数,则无需记录如果传递非整数,则会引发 TypeError。除非是常见情况,例如 Hash#fetch 引发 KeyError,否则不要提供引发异常的示例。

相关方法(可选)

在某些情况下,记录哪些方法与当前方法相关很有用。例如,Hash#[] 的文档可以提及 Hash#fetch 作为相关方法,而 Hash#merge 可以提及 Hash#merge! 作为相关方法。

接受多种参数类型的函数

对于接受多种参数类型的函数,在某些情况下,单独记录不同的参数类型可能很有用。最好为要讨论的每种情况使用一个单独的段落。