下面给你一套可落地的 RBAC 方案,技术栈按:Salvo 0.93.0 + Sqlx + MySQL 8.0 + Redis 6。 Salvo 当前 docs.rs 最新版本显示为 0.93.0,发布时间为 2026-05-01;Salvo 的 Handler 既可以作为最终接口处理器,也可以作为中间件,这很适合实现“登录认证中间件 + 权限校验中间件”。
for n in &vec 拿到的是 &T,不是 T。要不要写 *n,取决于你后面这个地方需要的是“引用”还是“值本身”。
& 的主要作用是“借用”,也就是拿到某个值的引用,但不取得它的所有权。
Result 与可恢复的错误
大部分错误并没有严重到需要程序完全停止执行。有时,一个函数会因为一个容易理解并做出反应的原因失败。例如,如果因为打开一个并不存在的文件而失败,此时我们可能想要创建这个文件,而不是终止进程。
回忆一下第 2 章 “使用 Result 类型来处理潜在的错误” 部分中的那个 Result 枚举,它定义有如下两个成员,Ok 和 Err:
enum Result<T, E> {
Ok(T),
Err(E),
}
下面用一句话先概括:
String 是拥有所有权、可变、堆上的字符串;&String 是对 String 的引用;&str 是字符串切片/视图;字符串字面量 "hello" 的类型通常是 &'static str。
什么是字符串?
在开始深入这些方面之前,我们需要讨论一下术语 字符串 的具体意义。Rust 的核心语言中只有一种字符串类型:str,字符串 slice,它通常以被借用的形式出现 &str。第 4 章讲到了 字符串 slice:它们是一些储存在别处的 UTF-8 编码字符串数据的引用。比如字符串字面量被储存在程序的二进制输出中,字符串 slice 也是如此。
称作 String 的类型是由标准库提供的,而没有写进核心语言部分,它是可增长的、可变的、有所有权的、UTF-8 编码的字符串类型。当 Rustacean 们谈到 Rust 的 “字符串”时,它们通常指的是 String 和字符串 slice &str 类型,而不仅仅是其中之一。虽然本部分内容大多是关于 String ,不
在 Rust 中,vector 通常指的是 Vec<T>。
中文可以叫:动态数组 / 可变长数组。。。也有人直译叫:向量
| Rust 概念 | Java 大概对应 | 说明 |
|---|---|---|
crate |
Maven artifact / jar 包 / Java 模块 | Rust 的最小编译单元,也是依赖发布单位 |
package |
Maven 项目 / Gradle project | 一个 Rust package 里可以包含一个或多个 crate |
Cargo.toml |
pom.xml / build.gradle |
管理依赖、版本、构建配置 |
cargo |
Maven / Gradle | Rust 官方构建、依赖、测试、发布工具 |
crates.io |
Maven Central | Rust 官方/主流 crate 仓库 |
module / mod |
Java package 的一部分概念 | Rust 代码组织方式,不等于 Java package |
use |
import |
引入模块、类型、函数 |
pub |
public |
控制可见性 |
trait |
interface | 定义能力/行为,类似 Java 接口 |
impl |
class implements interface / 方法实现 | 给类型实现方法或 trait |
struct |
class / record / DTO | Rust 的结构体,只有数据字段,没有继承 |
enum |
enum + sealed class | Rust enum 比 Java enum 强很多,可携带数据 |
workspace |
Maven multi-module project | 多个 package 放在一个工程里统一管理 |
if let 获取通过等号分隔的一个模式和一个表达式。它的工作方式与 match 相同,这里的表达式对应 match 而模式则对应第一个分支。
#![allow(unused)]
fn main() {
#[derive(Debug)]
enum UsState {
Alabama,
Alaska,
}
enum Coin {
Penny,
Nickel,
Dime,
Quarter(UsState),
}
let coin = Coin::Penny;
let mut count = 0;
if let Coin::Quarter(state) = coin {
println!("State quarter from {:?}!", state);
} else {
count += 1;
}
}
Rust 有一个叫做 match 的极为强大的控制流运算符,它允许我们将一个值与一系列的模式相比较,并根据相匹配的模式执行相应代码。模式可由字面量、变量、通配符和许多其他内容构成;
让我们用它们来作为一个使用 match 的例子!我们可以编写一个函数来获取一个未知的硬币,并以一种类似验钞机的方式,确定它是何种硬币并返回它的美分值,如示例 6-3 中所示。
enum Coin {
Penny,
Nickel,
Dime,
Quarter,
}
fn value_in_cents(coin: Coin) -> u8 {
match coin {
Coin::Penny => 1,
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter => 25,
}
}