Rust - Comments & Documentation
Overview
Estimated time: 25–35 minutes
Learn about Rust's commenting system, including regular comments, documentation comments, and how to generate beautiful documentation with rustdoc
. Master the art of writing clear, maintainable code with proper documentation.
Learning Objectives
- Write single-line and multi-line comments in Rust.
- Use documentation comments for functions, structs, and modules.
- Generate HTML documentation with
rustdoc
. - Follow Rust documentation conventions and best practices.
- Include code examples in documentation comments.
Prerequisites
Comment Types
Single-Line Comments
Use //
for single-line comments. These are ignored by the compiler and used for explaining code:
fn main() {
// This is a single-line comment
let x = 5; // Comments can be at the end of a line
// You can have multiple single-line comments
// to explain complex logic
let y = x * 2;
}
Multi-Line Comments
Use /* */
for multi-line comments. While less common in Rust, they're useful for temporarily disabling blocks of code:
fn main() {
/*
* This is a multi-line comment.
* It can span multiple lines.
* Useful for larger explanations.
*/
let x = 10;
/*
let y = 20; // This code is commented out
let z = x + y;
*/
}
Documentation Comments
Outer Documentation Comments
Use ///
for documentation comments that describe the item that follows:
/// Calculates the area of a rectangle.
///
/// # Arguments
///
/// * `width` - The width of the rectangle
/// * `height` - The height of the rectangle
///
/// # Examples
///
/// ```
/// let area = calculate_area(5.0, 3.0);
/// assert_eq!(area, 15.0);
/// ```
fn calculate_area(width: f64, height: f64) -> f64 {
width * height
}
/// A person with a name and age.
///
/// # Examples
///
/// ```
/// let person = Person::new("Alice", 30);
/// println!("{}", person.name);
/// ```
pub struct Person {
/// The person's name
pub name: String,
/// The person's age in years
pub age: u32,
}
Inner Documentation Comments
Use //!
for documentation comments that describe the containing item (module, crate, etc.):
//! This module provides utilities for geometric calculations.
//!
//! It includes functions for calculating areas, perimeters,
//! and other geometric properties.
/// Calculate the circumference of a circle
pub fn circle_circumference(radius: f64) -> f64 {
2.0 * std::f64::consts::PI * radius
}
Documentation Sections
Common Documentation Sections
Rust documentation commonly uses these sections:
/// Brief description of the function.
///
/// Longer description with more details about what
/// the function does and when to use it.
///
/// # Arguments
///
/// * `param1` - Description of the first parameter
/// * `param2` - Description of the second parameter
///
/// # Returns
///
/// Description of what the function returns.
///
/// # Examples
///
/// ```
/// let result = my_function(1, 2);
/// assert_eq!(result, 3);
/// ```
///
/// # Panics
///
/// This function panics if the input is negative.
///
/// # Errors
///
/// This function returns an error if the file cannot be read.
///
/// # Safety
///
/// This function is unsafe because it dereferences raw pointers.
fn my_function(param1: i32, param2: i32) -> i32 {
param1 + param2
}
Generating Documentation
Using rustdoc
Generate HTML documentation from your doc comments:
# Generate documentation for your crate
cargo doc
# Generate and open documentation in browser
cargo doc --open
# Include private items in documentation
cargo doc --document-private-items
Testing Documentation Examples
Rust can test the code examples in your documentation:
# Run documentation tests
cargo test --doc
# Example that will be tested
/// Adds two numbers together.
///
/// # Examples
///
/// ```
/// assert_eq!(add(2, 3), 5);
/// ```
fn add(a: i32, b: i32) -> i32 {
a + b
}
Best Practices
Writing Good Documentation
- Be concise but complete: Explain what, why, and how
- Include examples: Show typical usage patterns
- Document edge cases: Mention panics, errors, and special behavior
- Use proper formatting: Leverage Markdown in doc comments
/// Divides two numbers.
///
/// This function performs floating-point division. For integer division,
/// use the `/` operator directly.
///
/// # Arguments
///
/// * `dividend` - The number to be divided
/// * `divisor` - The number to divide by
///
/// # Returns
///
/// The result of the division as a floating-point number.
///
/// # Panics
///
/// This function will panic if `divisor` is zero.
///
/// # Examples
///
/// ```
/// let result = divide(10.0, 2.0);
/// assert_eq!(result, 5.0);
/// ```
fn divide(dividend: f64, divisor: f64) -> f64 {
if divisor == 0.0 {
panic!("Cannot divide by zero!");
}
dividend / divisor
}
Markdown in Documentation
Formatting Options
Doc comments support Markdown formatting:
/// This function demonstrates **Markdown** formatting.
///
/// You can use:
/// - *Italic text*
/// - **Bold text**
/// - `Code spans`
/// - [Links](https://doc.rust-lang.org/)
///
/// ## Code Blocks
///
/// ```rust
/// let x = 42;
/// println!("The answer is {}", x);
/// ```
///
/// ## Lists
///
/// 1. First item
/// 2. Second item
/// 3. Third item
fn documented_function() {
println!("Hello, documentation!");
}
Common Pitfalls
Mistakes to Avoid
- Outdated documentation: Keep docs synchronized with code changes
- Over-commenting obvious code: Don't explain what is already clear
- Missing examples: Complex functions should include usage examples
- Inconsistent style: Follow the project's documentation conventions
Checks for Understanding
- What's the difference between
//
and///
comments? - When would you use
//!
instead of///
? - How do you generate HTML documentation from doc comments?
- What happens when you run
cargo test --doc
?
Answers
//
are regular comments ignored by rustdoc;///
are documentation comments that appear in generated docs- Use
//!
for inner documentation that describes the containing module or crate - Use
cargo doc
orcargo doc --open
to generate and view HTML documentation - It runs the code examples in documentation comments as tests to ensure they work correctly