Rust语法基础 #

一、注释 #

1.1 普通注释 #

rust
// 单行注释:用于简短说明

/*
 * 多行注释:
 * 用于较长的说明
 * 可以跨越多行
 */

1.2 文档注释 #

文档注释支持Markdown格式,用于生成文档:

rust
/// 这是函数文档注释
/// 
/// # Examples
/// 
/// ```
/// let result = add(2, 3);
/// assert_eq!(result, 5);
/// ```
/// 
/// # Panics
/// 
/// 当参数溢出时会panic
/// 
/// # Errors
/// 
/// 此函数不返回错误
fn add(a: i32, b: i32) -> i32 {
    a + b
}

/// 结构体文档注释
/// 
/// 用于表示一个人的基本信息
struct Person {
    /// 人的姓名
    name: String,
    /// 人的年龄
    age: u32,
}

//! 模块级文档注释
//! 
//! 这个注释描述整个模块或crate
//! 通常放在文件开头

1.3 文档注释章节 #

常用章节标记:

章节 用途
Examples 示例代码
Panics 可能panic的情况
Errors 可能返回的错误
Safety unsafe代码的安全说明
Arguments 参数说明

二、标识符 #

2.1 命名规则 #

Rust标识符遵循以下规则:

  • 可以包含字母、数字、下划线
  • 必须以字母或下划线开头
  • 区分大小写
  • 不能使用保留关键字
rust
// 合法标识符
let name = "Alice";
let _count = 10;
let user_name = "Bob";
let UserName = "Charlie";  // 类型命名风格
let MAX_SIZE = 100;        // 常量命名风格

// 非法标识符
// let 2fast = true;       // 错误:以数字开头
// let my-var = 10;        // 错误:包含连字符
// let fn = "function";    // 错误:使用关键字

2.2 命名约定 #

Rust有明确的命名约定:

类型 命名风格 示例
变量/函数 snake_case user_name, calculate_total
类型/结构体/枚举 PascalCase Person, HttpStatus
常量 SCREAMING_SNAKE_CASE MAX_SIZE, DEFAULT_PORT
模块 snake_case my_module
生命周期 小写字母 'a, 'static
特征 PascalCase Display, Clone
rust
// 变量和函数
let user_count = 100;
fn calculate_total_price(base: f64, tax: f64) -> f64 { ... }

// 类型
struct UserAccount { ... }
enum HttpStatus { ... }

// 常量
const MAX_CONNECTIONS: usize = 100;
static DEFAULT_TIMEOUT: u64 = 30;

// 特征
trait Serializable { ... }

2.3 原始标识符 #

使用关键字作为标识符时,需要加 r# 前缀:

rust
let r#match = "value";
let r#fn = "function";
let r#type = "type";

println!("{}", r#match);

三、关键字 #

3.1 保留关键字 #

Rust保留的关键字:

严格保留关键字(不能用作标识符):

text
as, break, const, continue, crate, else, enum, extern, false, fn, for, 
if, impl, in, let, loop, match, mod, move, mut, pub, ref, return, 
self, Self, static, struct, super, trait, true, type, unsafe, use, 
where, while, async, await, dyn

弱保留关键字(特定上下文保留):

text
abstract, become, box, do, final, macro, override, priv, typeof, 
unsized, virtual, yield

3.2 关键字用途 #

关键字 用途
let 变量声明
const 常量声明
fn 函数定义
struct 结构体定义
enum 枚举定义
impl 实现块
trait 特征定义
pub 公开可见性
mod 模块定义
use 导入模块
match 模式匹配
if, else 条件语句
loop, while, for 循环语句
return 返回值
self, Self 当前实例/类型
mut 可变性
ref 引用绑定
move 所有权转移
async, await 异步编程
unsafe 不安全代码块
dyn 动态分发
where 约束子句
type 类型别名
static 静态变量
extern 外部链接
as 类型转换/重命名
in for循环迭代
super, crate 模块路径

3.3 关键字示例 #

rust
// let - 变量声明
let x = 5;
let mut y = 10;

// const - 常量
const MAX_POINTS: u32 = 100_000;

// fn - 函数
fn add(a: i32, b: i32) -> i32 {
    a + b
}

// struct - 结构体
struct Point {
    x: i32,
    y: i32,
}

// enum - 枚举
enum Option<T> {
    Some(T),
    None,
}

// impl - 实现
impl Point {
    fn new(x: i32, y: i32) -> Self {
        Self { x, y }
    }
}

// trait - 特征
trait Display {
    fn fmt(&self) -> String;
}

// match - 模式匹配
match value {
    0 => println!("zero"),
    1 => println!("one"),
    _ => println!("other"),
}

// async/await - 异步
async fn fetch_data() -> String {
    let data = get_data().await;
    data
}

四、代码风格 #

4.1 缩进与空格 #

  • 使用4个空格缩进(不是Tab)
  • 行宽建议100字符
  • 运算符两侧加空格
  • 逗号后加空格
rust
// 推荐
fn calculate(a: i32, b: i32, c: i32) -> i32 {
    let result = a + b * c;
    if result > 100 {
        return 100;
    }
    result
}

// 不推荐
fn calculate(a:i32,b:i32,c:i32)->i32{
    let result=a+b*c;
    if result>100{return 100;}
    result
}

4.2 大括号风格 #

左大括号不换行:

rust
// 推荐
fn main() {
    if condition {
        do_something();
    } else {
        do_other();
    }
}

// 不推荐
fn main() 
{
    if condition 
    {
        do_something();
    }
}

4.3 函数定义 #

rust
// 短函数可以单行
fn identity(x: i32) -> i32 { x }

// 长函数多行
fn complex_function(
    param1: i32,
    param2: String,
    param3: Vec<i32>,
) -> Result<String, Error> {
    // 函数体
    Ok(String::new())
}

4.4 链式调用 #

rust
let result = collection
    .iter()
    .filter(|x| x > 0)
    .map(|x| x * 2)
    .collect::<Vec<_>>();

4.5 结构体初始化 #

rust
// 多字段时换行
let person = Person {
    name: String::from("Alice"),
    age: 30,
    city: String::from("Beijing"),
};

// 简短时可单行
let point = Point { x: 0, y: 0 };

4.6 导入组织 #

rust
// 标准库
use std::collections::HashMap;
use std::io::Read;

// 外部库
use serde::{Deserialize, Serialize};
use tokio::net::TcpStream;

// 本地模块
use crate::models::User;
use super::utils;

五、使用rustfmt #

5.1 格式化代码 #

bash
# 格式化当前项目
cargo fmt

# 格式化特定文件
rustfmt src/main.rs

# 检查格式(不修改)
cargo fmt -- --check

5.2 配置rustfmt #

创建 rustfmt.toml

toml
max_width = 100
tab_spaces = 4
edition = "2021"
use_small_heuristics = "Default"

六、使用clippy #

6.1 代码检查 #

bash
# 运行clippy
cargo clippy

# 自动修复
cargo clippy --fix

6.2 常见警告 #

rust
// 警告:未使用的变量
fn example() {
    let x = 5;  // 警告:unused variable
}

// 修复:使用下划线前缀
fn example() {
    let _x = 5;  // 正确
}

// 警告:不必要的克隆
fn example() {
    let s = String::from("hello");
    let len = s.clone().len();  // 警告:unnecessary clone
}

// 修复
fn example() {
    let s = String::from("hello");
    let len = s.len();  // 正确
}

七、表达式与语句 #

7.1 语句 #

语句执行操作但不返回值,以分号结尾:

rust
let x = 5;  // 语句
println!("{}", x);  // 语句

7.2 表达式 #

表达式返回值,不以分号结尾:

rust
5 + 5  // 表达式,返回10

// 块表达式
let y = {
    let x = 3;
    x + 1  // 表达式,返回4
};

7.3 表达式与语句的区别 #

rust
fn main() {
    // 语句
    let x = 5;
    
    // 块表达式
    let y = {
        let a = 1;
        let b = 2;
        a + b  // 无分号,表达式,返回值
    };
    
    println!("y = {}", y);  // y = 3
    
    // 如果加分号,变成语句
    let z = {
        let a = 1;
        let b = 2;
        a + b;  // 有分号,语句,返回 ()
    };
    
    println!("z = {:?}", z);  // z = ()
}

八、总结 #

本章学习了:

  • 注释的三种形式
  • 标识符命名规则和约定
  • 保留关键字
  • 代码风格规范
  • rustfmt和clippy工具
  • 表达式与语句的区别

遵循良好的代码规范能让代码更易读、更易维护。下一章,我们将学习Rust的数据类型。

最后更新:2026-03-27