文档与 rustdoc
问题
Rust 的文档系统有什么特色?
答案
Rust 的 rustdoc 能从源码注释自动生成 HTML 文档,且文档中的代码示例会被自动测试。
文档注释
/// 解析 CSV 行为字段列表
///
/// # Arguments
///
/// * `line` - 一行 CSV 文本
/// * `delimiter` - 分隔符
///
/// # Returns
///
/// 字段字符串的 Vec
///
/// # Examples
///
/// ```
/// use my_lib::parse_csv_line;
/// let fields = parse_csv_line("a,b,c", ',');
/// assert_eq!(fields, vec!["a", "b", "c"]);
/// ```
///
/// # Panics
///
/// 如果输入包含未闭合的引号
///
/// # Errors
///
/// 此函数不返回错误
pub fn parse_csv_line(line: &str, delimiter: char) -> Vec<String> {
line.split(delimiter).map(|s| s.trim().to_string()).collect()
}
//! 模块级文档(放在文件顶部)
//!
//! 这个模块提供 CSV 解析功能。
常用文档段落
| 段落 | 说明 |
|---|---|
# Examples | 使用示例(会被测试) |
# Panics | 何时会 panic |
# Errors | 何时返回 Err |
# Safety | unsafe 函数的安全前提条件 |
命令
cargo doc --open # 生成并打开文档
cargo doc --no-deps # 不生成依赖的文档
cargo test --doc # 只运行文档测试
Rust 特色
文档测试是 Rust 的杀手锏:代码示例永远不会过期,因为它们会被编译和运行。这在其他语言中极为罕见。
常见面试问题
Q1: 文档测试有什么限制?
答案:
- 每个文档测试都是独立的 crate,不能访问私有 API
- 需要写完整的
use语句 - 可以用
#前缀隐藏辅助代码(在文档中不显示但会编译)
/// ```
/// # // 这行在文档中不显示
/// # use my_lib::parse;
/// let result = parse("hello");
/// assert!(result.is_ok());
/// ```
相关链接
- rustdoc Book
- docs.rs — 自动生成所有 crate 的文档