第二篇: Rust 关键字详解

81 阅读10分钟

Rust 关键字详解

一、本项目中使用的 Rust 关键字

1. mod - 模块声明

作用: 声明一个模块,用于组织代码

项目使用示例:

mod config;         // 声明 config 模块
mod controllers;    // 声明 controllers 模块
mod models;         // 声明 models 模块

说明:

  • mod config; 会查找 config.rs 或 config/mod.rs 文件
  • 模块是 Rust 的代码组织单元,类似于其他语言的包或命名空间

2. use - 导入路径

作用: 将模块、类型或函数引入当前作用域

项目使用示例:

use config::{database, AppState, Config};
use axum::extract::State;
use serde::{Deserialize, Serialize};

说明:

  • 避免每次都写完整路径(如 std::collections::HashMap
  • 可以使用 as 重命名导入的项
  • :: 用于访问模块中的内容

3. async - 异步函数

作用: 声明一个异步函数,返回 Future

项目使用示例:

async fn main() -> anyhow::Result<()> {
    // 异步代码
}

pub async fn create_user(&self, payload: CreateUserRequest) -> Result<User> {
    // 异步操作
}

说明:

  • 异步函数不会阻塞线程
  • 必须在异步运行时(如 Tokio)中运行
  • 调用异步函数时需要使用 .await

4. await - 等待异步操作

作用: 等待异步操作完成

项目使用示例:

let db = database::create_pool(&config.database_url).await?;
let user = user_service.create_user(payload).await?;

说明:

  • 只能在 async 函数中使用
  • 会暂停当前函数执行,等待 Future 完成
  • 不会阻塞线程,线程可以执行其他任务

5. fn - 函数声明

作用: 声明一个函数

项目使用示例:

fn main() -> anyhow::Result<()> {
    // 函数体
}

pub fn new(db: MySqlPool, cache: RedisCache) -> Self {
    Self { db, cache }
}

说明:

  • fn 用于声明同步函数
  • async fn 用于声明异步函数
  • pub fn 声明公开函数

6. let - 变量绑定

作用: 声明变量并绑定值

项目使用示例:

let config = Config::from_env();
let db = database::create_pool(&config.database_url).await?;
let mut query = "UPDATE users SET ".to_string();

说明:

  • 变量默认是不可变的(immutable)
  • 使用 let mut 声明可变变量
  • 支持类型推导,通常不需要显式指定类型

7. mut - 可变性标记

作用: 标记变量或引用为可变的

项目使用示例:

let mut query = "UPDATE users SET ".to_string();
let mut updates = Vec::new();

说明:

  • Rust 中变量默认不可变
  • mut 允许修改变量的值
  • 这是 Rust 安全性的重要保证

8. struct - 结构体定义

作用: 定义一个结构体类型

项目使用示例:

pub struct User {
    pub id: i64,
    pub username: String,
    pub email: String,
}

pub struct AppState {
    pub db: MySqlPool,
    pub cache: RedisCache,
}

说明:

  • 结构体是自定义数据类型
  • 可以包含多个字段
  • 使用 pub 可以公开字段

9. impl - 实现代码块

作用: 为类型实现方法或 trait

项目使用示例:

impl UserService {
    pub fn new(db: MySqlPool, cache: RedisCache) -> Self {
        Self { db, cache }
    }
}

impl From<User> for UserResponse {
    fn from(user: User) -> Self {
        UserResponse { /* ... */ }
    }
}

说明:

  • impl TypeName 为类型实现方法
  • impl TraitName for TypeName 为类型实现 trait
  • Self 代表当前类型

10. pub - 公开可见性

作用: 使项(函数、结构体、字段等)公开可访问

项目使用示例:

pub struct User { /* ... */ }
pub async fn create_user() { /* ... */ }
pub fn new() -> Self { /* ... */ }

说明:

  • 默认情况下,所有项都是私有的
  • pub 使项可以从模块外部访问
  • 可以使用 pub(crate) 限制在当前 crate 内可见

11. match - 模式匹配

作用: 对值进行模式匹配

项目使用示例:

match user_service.create_user(payload).await {
    Ok(user) => {
        let response: UserResponse = user.into();
        Ok((StatusCode::CREATED, Json(response)))
    }
    Err(e) => Err((
        StatusCode::INTERNAL_SERVER_ERROR,
        Json(json!({"error": e.to_string()})),
    )),
}

说明:

  • 必须穷尽所有可能的模式
  • 每个分支返回相同类型的值
  • 比 if-else 更强大和安全

12. if / else - 条件语句

作用: 条件分支执行

项目使用示例:

if updates.is_empty() {
    return Ok(existing_user);
}

if result.rows_affected() > 0 {
    Ok(true)
} else {
    Ok(false)
}

说明:

  • if 是表达式,可以返回值
  • 不需要括号包裹条件
  • else if 用于多个条件

13. return - 提前返回

作用: 从函数中提前返回

项目使用示例:

if existing_user.is_none() {
    return Ok(None);
}

if let Ok(Some(cached_user)) = self.cache.get(&cache_key).await {
    return Ok(Some(user));
}

说明:

  • Rust 函数最后一个表达式会自动返回
  • return 用于提前退出函数
  • 通常不需要在函数末尾使用 return

14. crate - 当前包

作用: 引用当前 crate 的根模块

项目使用示例:

use crate::models::User;
use crate::config::AppState;
use crate::utils::cache::RedisCache;

说明:

  • crate 表示当前项目的根模块
  • 相当于绝对路径的起点
  • 可以避免相对路径的复杂性

15. as - 类型转换

作用: 显式类型转换

项目使用示例:

let user_id = result.0 as i64;

说明:

  • 用于基本类型之间的转换
  • 也可以用于重命名导入的项:use std::io::Result as IoResult
  • 转换可能会丢失精度或溢出

16. ref - 引用模式

作用: 在模式匹配中创建引用

项目使用示例:

if let Some(ref u) = user {
    let user_json = serde_json::to_string(u)?;
}

说明:

  • ref 在模式匹配中借用值而不是移动
  • 等价于 & 但用在模式匹配中
  • 保留原变量的所有权

二、Rust 所有关键字完整列表

当前使用的关键字(Keywords)

1. as
  • 用途: 类型转换、导入重命名
  • 示例let x = 5 as f64;use std::io::Result as IoResult;
2. async
  • 用途: 声明异步函数、代码块
  • 示例async fn foo() {}async { /* ... */ }
3. await
  • 用途: 等待异步操作完成
  • 示例let result = future.await;
4. break
  • 用途: 退出循环
  • 示例loop { break; }
5. const
  • 用途: 定义常量或常量函数
  • 示例const MAX_SIZE: usize = 100;
6. continue
  • 用途: 跳过当前循环迭代
  • 示例for i in 0..10 { if i % 2 == 0 { continue; } }
7. crate
  • 用途: 引用当前 crate 的根
  • 示例use crate::models::User;
8. dyn
  • 用途: 动态分发的 trait 对象
  • 示例Box<dyn Trait>
9. else
  • 用途: 条件语句的否定分支
  • 示例if condition { } else { }
10. enum
  • 用途: 定义枚举类型
  • 示例:
enum Result<T, E> {
    Ok(T),
    Err(E),
}
11. extern
  • 用途: 链接外部代码(FFI)
  • 示例extern "C" { fn printf(fmt: *const u8); }
12. false
  • 用途: 布尔值假
  • 示例let flag = false;
13. fn
  • 用途: 声明函数
  • 示例fn add(a: i32, b: i32) -> i32 { a + b }
14. for
  • 用途: for 循环
  • 示例for i in 0..10 { println!("{}", i); }
15. if
  • 用途: 条件语句
  • 示例if x > 0 { println!("positive"); }
16. impl
  • 用途: 实现方法或 trait
  • 示例impl MyStruct { fn new() -> Self { } }
17. in
  • 用途: for 循环的一部分
  • 示例for item in collection { }
18. let
  • 用途: 变量绑定
  • 示例let x = 5;
19. loop
  • 用途: 无限循环
  • 示例loop { /* ... */ }
20. match
  • 用途: 模式匹配
  • 示例:
match value {
    Some(x) => x,
    None => 0,
}
21. mod
  • 用途: 定义模块
  • 示例mod utils;
22. move
  • 用途: 闭包捕获所有权
  • 示例let closure = move || { println!("{}", x); };
23. mut
  • 用途: 可变性标记
  • 示例let mut x = 5;
24. pub
  • 用途: 公开可见性
  • 示例pub fn public_function() { }
25. ref
  • 用途: 引用模式绑定
  • 示例if let Some(ref x) = option { }
26. return
  • 用途: 从函数返回
  • 示例return 42;
27. self
  • 用途: 当前模块或方法接收者
  • 示例fn method(&self) { }
28. Self
  • 用途: 当前类型的别名
  • 示例impl MyType { fn new() -> Self { } }
29. static
  • 用途: 静态变量或生命周期
  • 示例static GLOBAL: i32 = 0;
30. struct
  • 用途: 定义结构体
  • 示例struct Point { x: i32, y: i32 }
31. super
  • 用途: 父模块
  • 示例use super::parent_function;
32. trait
  • 用途: 定义 trait(接口)
  • 示例:
trait Drawable {
    fn draw(&self);
}
33. true
  • 用途: 布尔值真
  • 示例let flag = true;
34. type
  • 用途: 类型别名
  • 示例type Result<T> = std::result::Result<T, Error>;
35. unsafe
  • 用途: 不安全代码块
  • 示例unsafe { /* 不安全操作 */ }
36. use
  • 用途: 导入路径
  • 示例use std::collections::HashMap;
37. where
  • 用途: 泛型约束
  • 示例:
fn foo<T>(x: T) where T: Clone { }
38. while
  • 用途: while 循环
  • 示例while condition { /* ... */ }

保留关键字(Reserved Keywords)

这些关键字目前未使用,但保留供将来使用:

1. abstract
  • 状态: 保留
  • 预期用途: 可能用于抽象类型
2. become
  • 状态: 保留
  • 预期用途: 尾调用优化
3. box
  • 状态: 保留(曾经用于堆分配)
  • 预期用途: 堆分配语法糖
4. do
  • 状态: 保留
  • 预期用途: 可能用于循环或闭包
5. final
  • 状态: 保留
  • 预期用途: 可能用于禁止覆盖
6. macro
  • 状态: 保留
  • 预期用途: 声明宏(部分已在 macro_rules! 中使用)
7. override
  • 状态: 保留
  • 预期用途: 显式覆盖父类方法
8. priv
  • 状态: 保留
  • 预期用途: 可能的可见性修饰符
9. try
  • 状态: 保留(曾在 try 块中使用)
  • 预期用途: 错误处理语法
10. typeof
  • 状态: 保留
  • 预期用途: 获取类型信息
11. unsized
  • 状态: 保留
  • 预期用途: 动态大小类型
12. virtual
  • 状态: 保留
  • 预期用途: 虚方法
13. yield
  • 状态: 保留
  • 预期用途: 生成器(generators)

特殊标识符(Special Identifiers)

虽然不是严格的关键字,但有特殊含义:

1. 'static
  • 用途: 静态生命周期
  • 示例let s: &'static str = "hello";
2. _
  • 用途: 忽略值或通配符
  • 示例let _ = some_value;Some(_) => { }

三、本项目关键字使用统计

关键字使用频率主要用途
use导入模块和类型
async异步函数声明
await等待异步操作
fn函数声明
let变量绑定
pub公开可见性
struct定义数据结构
impl实现方法
match模式匹配
if条件判断
mod模块声明
mut可变变量
return提前返回
as类型转换
ref引用模式

四、重要概念说明

1. 所有权(Ownership)相关关键字

  • let: 绑定并获取所有权
  • mut: 可变借用
  • ref: 不可变借用(模式匹配)
  • move: 转移所有权(闭包)

2. 模块系统关键字

  • mod: 声明模块
  • use: 导入路径
  • pub: 公开可见性
  • crate: 当前包根
  • super: 父模块
  • self: 当前模块

3. 异步编程关键字

  • async: 异步函数
  • await: 等待异步完成

4. 类型系统关键字

  • struct: 结构体
  • enum: 枚举
  • trait: trait(接口)
  • impl: 实现
  • type: 类型别名
  • Self: 当前类型

5. 控制流关键字

  • if/else: 条件
  • match: 模式匹配
  • loop: 无限循环
  • while: 条件循环
  • for/in: 迭代循环
  • break: 退出循环
  • continue: 跳过迭代
  • return: 返回

6. 函数相关关键字

  • fn: 函数声明
  • const: 常量函数
  • unsafe: 不安全函数

五、学习建议

初学者应优先掌握的关键字(重要性排序)

  1. 基础变量和函数

    • letfnpubreturn
  2. 控制流

    • ifelsematchloopforwhile
  3. 模块系统

    • modusecrate
  4. 结构体和实现

    • structimplSelf
  5. 可变性和所有权

    • mutref
  6. 异步编程(进阶)

    • asyncawait
  7. 高级特性(进阶)

    • traitdynunsafe

六、本项目中未使用但重要的关键字

1. enum - 枚举类型

enum Status {
    Success,
    Error(String),
}

建议: 可以用于更好的错误处理和状态管理

2. trait - 定义接口

trait UserRepository {
    async fn create(&self, user: CreateUserRequest) -> Result<User>;
    async fn find_by_id(&self, id: i64) -> Result<Option<User>>;
}

建议: 可以用于解耦和测试

3. const - 常量

const CACHE_TTL: u64 = 3600;
const MAX_USERS: usize = 100;

建议: 可以用于管理魔法数字

4. loop - 无限循环

loop {
    if condition {
        break;
    }
}

建议: 比 while true 更惯用


七、总结

本项目主要使用了 17 个核心关键字,覆盖了:

  • ✅ 模块系统(modusepubcrate
  • ✅ 变量和函数(letfnmut
  • ✅ 异步编程(asyncawait
  • ✅ 控制流(ifelsematchreturn
  • ✅ 类型系统(structimplSelf
  • ✅ 引用和转换(refas

Rust 共有 38 个活跃关键字 和 13 个保留关键字。本项目使用了约 45%  的活跃关键字,这对于一个 Web 服务来说是合理的覆盖率。