name: coding-guidelines
description: “当询问Rust代码风格或最佳实践时使用。关键词:命名、格式化、注释、clippy、rustfmt、lint、代码风格、最佳实践、P.NAM、G.FMT、代码审查、命名约定、变量命名、函数命名、类型命名、命名规范、代码风格、格式化、最佳实践、代码审查、怎么命名”
source: https://rust-coding-guidelines.github.io/rust-coding-guidelines-zh/
user-invocable: false
Rust编码规范(50条核心规则)
命名(Rust特有)
| 规则 |
指导原则 |
不使用get_前缀 |
fn name()而非fn get_name() |
| 迭代器约定 |
iter() / iter_mut() / into_iter() |
| 转换命名 |
as_(廉价借用)、to_(昂贵复制)、into_(所有权转移) |
| 静态变量前缀 |
static用G_CONFIG,const无前缀 |
数据类型
| 规则 |
指导原则 |
| 使用新类型 |
struct Email(String)用于领域语义 |
| 优先切片模式 |
if let [first, .., last] = slice |
| 预分配 |
Vec::with_capacity()、String::with_capacity() |
| 避免滥用Vec |
固定大小使用数组 |
字符串
| 规则 |
指导原则 |
| 优先字节操作 |
ASCII场景用s.bytes()而非s.chars() |
使用Cow<str> |
可能修改借用数据时 |
使用format! |
优于字符串拼接+ |
| 避免嵌套迭代 |
字符串contains()是O(n*m) |
错误处理
| 规则 |
指导原则 |
使用?传播 |
而非try!()宏 |
expect()优于unwrap() |
值有保证时使用 |
| 断言用于不变量 |
函数入口用assert! |
内存
| 规则 |
指导原则 |
| 有意义的生命周期 |
'src、'ctx而非仅'a |
RefCell用try_borrow() |
避免panic |
| 转换使用变量遮蔽 |
let x = x.parse()? |
并发
| 规则 |
指导原则 |
| 识别锁顺序 |
预防死锁 |
| 基本类型用原子操作 |
bool/usize不用Mutex |
| 谨慎选择内存序 |
Relaxed/Acquire/Release/SeqCst |
异步
| 规则 |
指导原则 |
| CPU密集型用同步 |
异步用于I/O |
| 不在await期间持有锁 |
使用作用域守卫 |
宏
| 规则 |
指导原则 |
| 非必要避免 |
优先函数/泛型 |
| 遵循Rust语法 |
宏输入应类似Rust代码 |
已弃用 → 更好选择
| 已弃用 |
更好选择 |
起始版本 |
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!() |
?运算符 |
2018 |
快速参考
命名:snake_case(函数/变量)、CamelCase(类型)、SCREAMING_CASE(常量)
格式化:rustfmt(直接用)
文档:///用于公开项、//!用于模块文档
代码检查:#![warn(clippy::all)]
Claude熟悉Rust约定。这些是非显而易见的Rust特有规则。