引言:为什么 Rust 中的文档不是奢侈品,而是必需品
\n\nRust 以其内存安全、高性能和严格的类型系统而闻名。然而,即使是最优雅的代码,如果没人知道如何使用它,也是毫无价值的。高质量的文档是连接您的代码和用户(包括半年后的您自己)的桥梁。
\n\n幸运的是,Rust 内置了强大的工具,可以直接从源代码自动生成文档。在本文中,我们将剖析整个过程:从简单的注释到创建包含示例、链接甚至数学公式的完整文档。
\n\n1. 基础:doc 注释和 rustdoc
\n\nRust 中有两种类型的注释:普通注释(// 和 /* */)和文档注释(/// 和 //!)。后者由 rustdoc 工具处理,用于生成 HTML 文档。
1.1. 外部和内部 doc 注释
\n\n- \n
///— 外部注释。写在元素(函数、结构体、trait)之前,用于描述该元素。 \n //!— 内部注释。用于记录模块、crate 或文件本身。 \n
/// 计算 n 的阶乘。\n///\n/// # 示例\n/// ```\n/// let result = factorial(5);\n/// assert_eq!(result, 120);\n/// ```\npub fn factorial(n: u32) -> u32 {\n (1..=n).product()\n}\n\n//! # 我的超级 crate\n//!\n//! 这个 crate 提供了用于数学计算的工具。\n//! 更多详情请参见 [文档](https://example.com)。\n\n1.2. 运行文档生成
\n\n要生成文档,请执行以下命令:
\n\ncargo doc --open\n\n此命令将扫描您项目中的所有 doc 注释,在 target/doc/ 文件夹中创建 HTML 文件,并在浏览器中打开它们。您将看到一个包含模块、函数和结构体列表的页面——就像在 docs.rs 上一样。
2. 文档章节:如何使其易于阅读
\n\n仅仅编写注释是不够的。要使文档有用,需要对其进行结构化。rustdoc 支持 Markdown,因此您可以使用标题、列表、链接甚至代码块。
2.1. 标准章节
\n\n通常使用以下章节(以 # 开头):
- \n
# Examples— 一个或多个使用示例。 \n # Panics— 函数在哪些情况下会引发 panic。 \n # Errors— 如果函数返回Result,请描述可能的错误。 \n # Safety— 对于unsafe函数是必需的。 \n # Arguments— 参数说明(尽管通常直接在文本中描述)。 \n
/// 读取文件内容并将其作为字符串返回。\n///\n/// # Arguments\n/// * `path` — 文件路径。\n///\n/// # Errors\n/// 如果文件不存在或无法读取,则返回 `io::Error`。\n///\n/// # Panics\n/// 如果路径包含空字节,则引发 panic。\n///\n/// # Examples\n/// ```\n/// let content = read_file("hello.txt").unwrap();\n/// println!("{}", content);\n/// ```\npub fn read_file(path: &str) -> Result<String, std::io::Error> {\n std::fs::read_to_string(path)\n}\n\n2.2. 链接和交叉引用
\n\n您可以引用代码中的其他元素。rustdoc 会自动将它们转换为超链接:
/// 使用 [`factorial`] 函数计算组合数。\n/// 另请参见模块 [`math::combinatorics`]。\npub fn combinations(n: u32, k: u32) -> u32 {\n factorial(n) / (factorial(k) * factorial(n - k))\n}\n\n如果需要引用