---
name: rust-coding-guidelines
description: "Use when asking about Rust code style or best practices. Keywords: naming, formatting, comment, clippy, rustfmt, lint, code style, best practice, P.NAM, G.FMT, code review, naming convention, variable naming, function naming, type naming, 命名规范, 代码风格, 格式化, 最佳实践, 代码审查, 怎么命名"
source: https://rust-coding-guidelines.github.io/rust-coding-guidelines-zh/
user-invocable: false
---

# Rust Coding Guidelines (50 Core Rules)

## Naming (Rust-Specific)

| Rule                | Guideline                                               |
| ------------------- | ------------------------------------------------------- |
| No `get_` prefix    | `fn name()` not `fn get_name()`                         |
| Iterator convention | `iter()` / `iter_mut()` / `into_iter()`                 |
| Conversion naming   | `as_` (cheap &), `to_` (expensive), `into_` (ownership) |
| Static var prefix   | `G_CONFIG` for `static`, no prefix for `const`          |

## Data Types

| Rule                  | Guideline                                         |
| --------------------- | ------------------------------------------------- |
| Use newtypes          | `struct Email(String)` for domain semantics       |
| Prefer slice patterns | `if let [first, .., last] = slice`                |
| Pre-allocate          | `Vec::with_capacity()`, `String::with_capacity()` |
| Avoid Vec abuse       | Use arrays for fixed sizes                        |

## Strings

| Rule                   | Guideline                               |
| ---------------------- | --------------------------------------- |
| Prefer bytes           | `s.bytes()` over `s.chars()` when ASCII |
| Use `Cow<str>`         | When might modify borrowed data         |
| Use `format!`          | Over string concatenation with `+`      |
| Avoid nested iteration | `contains()` on string is O(n\*m)       |

## Error Handling

| Rule                       | Guideline                   |
| -------------------------- | --------------------------- |
| Use `?` propagation        | Not `try!()` macro          |
| `expect()` over `unwrap()` | When value guaranteed       |
| Assertions for invariants  | `assert!` at function entry |

## Memory

| Rule                         | Guideline                    |
| ---------------------------- | ---------------------------- |
| Meaningful lifetimes         | `'src`, `'ctx` not just `'a` |
| `try_borrow()` for RefCell   | Avoid panic                  |
| Shadowing for transformation | `let x = x.parse()?`         |

## Concurrency

| Rule                          | Guideline                      |
| ----------------------------- | ------------------------------ |
| Identify lock ordering        | Prevent deadlocks              |
| Atomics for primitives        | Not Mutex for bool/usize       |
| Choose memory order carefully | Relaxed/Acquire/Release/SeqCst |

## Async

| Rule                          | Guideline         |
| ----------------------------- | ----------------- |
| Sync for CPU-bound            | Async is for I/O  |
| Don't hold locks across await | Use scoped guards |

## Macros

| Rule                   | Guideline                         |
| ---------------------- | --------------------------------- |
| Avoid unless necessary | Prefer functions/generics         |
| Follow Rust syntax     | Macro input should look like Rust |

## Deprecated → Better

| Deprecated              | Better                | Since |
| ----------------------- | --------------------- | ----- |
| `lazy_static!`          | `std::sync::OnceLock` | 1.70  |
| `once_cell::Lazy`       | `std::sync::LazyLock` | 1.80  |
| `std::sync::mpsc`       | `crossbeam::channel`  | -     |
| `std::sync::Mutex`      | `parking_lot::Mutex`  | -     |
| `failure`/`error-chain` | `thiserror`/`anyhow`  | -     |
| `try!()`                | `?` operator          | 2018  |

## Quick Reference

```
Naming: snake_case (fn/var), CamelCase (type), SCREAMING_CASE (const)
Format: rustfmt (just use it)
Docs: /// for public items, //! for module docs
Lint: #![warn(clippy::all)]
```

Claude knows Rust conventions well. These are the non-obvious Rust-specific rules.
