不灭的焱

革命尚未成功,同志仍须努力 下载Java21

作者:AlbertWen  添加时间:2026-07-04 18:49:53  修改时间:2026-07-08 06:46:49  分类:01.Rust编程  编辑

这行代码:

#![allow(unused)]

作用是:告诉 Rust 编译器:不要提示“未使用”相关的警告

作者:AlbertWen  添加时间:2026-07-04 18:21:31  修改时间:2026-07-08 04:25:36  分类:01.Rust编程  编辑

让我们看看一个需要诉诸于代码的场景,来考虑为何此时使用枚举更为合适且实用。假设我们要处理 IP 地址。目前被广泛使用的两个主要 IP 标准:IPv4(version four)和 IPv6(version six)。这是我们的程序可能会遇到的所有可能的 IP 地址类型:所以可以 枚举 出所有可能的值,这也正是此枚举名字的由来。

可以通过在代码中定义一个 IpAddrKind 枚举来表现这个概念并列出可能的 IP 地址类型,V4 和 V6。这被称为枚举的 成员variants):

enum IpAddrKind {
    V4,
    V6,
}

现在 IpAddrKind 就是一个可以在代码中使用的自定义数据类型了。

枚举值

可以像这样创建 IpAddrKind 两个不同成员的实例:

let four = IpAddrKind::V4;
let six = IpAddrKind::V6;

 

作者:AlbertWen  添加时间:2026-07-04 16:39:25  修改时间:2026-07-08 03:24:36  分类:01.Rust编程  编辑

定义struct的方法

让我们把前面实现的获取一个 Rectangle 实例作为参数的 area 函数,改写成一个定义于 Rectangle 结构体上的 area 方法,如示例 5-13 所示:

文件名: src/main.rs

#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!(
        "The area of the rectangle is {} square pixels.",
        rect1.area()
    );
}

示例 5-13:在 Rectangle 结构体上定义 area 方法

作者:AlbertWen  添加时间:2026-07-04 11:57:07  修改时间:2026-07-08 05:11:28  分类:01.Rust编程  编辑

结构体和我们在“元组类型”章节论过的元组类似。和元组一样,结构体的每一部分可以是不同类型。但不同于元组,结构体需要命名各部分数据以便能清楚的表明其值的意义。由于有了这些名字,结构体比元组更灵活:不需要依赖顺序来指定或访问实例中的值。

作者:AlbertWen  添加时间:2026-07-04 09:40:45  修改时间:2026-07-08 05:00:42  分类:01.Rust编程  编辑

通过派生 trait 增加实用功能

如果能够在调试程序时打印出 Rectangle 实例来查看其所有字段的值就更好了。如下示例像前面章节那样尝试使用 println! 宏。但这并不行。

文件名: src/main.rs

struct Rectangle {
    width: u32,
    height: u32,
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!("rect1 is {}", rect1);
}

当我们运行这个代码时,会出现带有如下核心信息的错误:

error[E0277]: `Rectangle` doesn't implement `std::fmt::Display`
作者:AlbertWen  添加时间:2026-07-04 01:25:23  修改时间:2026-07-05 14:34:18  分类:01.Rust编程  编辑

字符串 slice

字符串 slicestring slice)是 String 中一部分值的引用,它看起来像这样:

fn main() {
    let s = String::from("hello world");

    let hello = &s[0..5];
    let world = &s[6..11];
}

字符串字面量就是 slice —— 类型为 &str

还记得我们讲到过字符串字面量被储存在二进制文件中吗?现在知道 slice 了,我们就可以正确地理解字符串字面量了:

let s = "Hello, world!";

这里 s 的类型是 &str :它是一个指向二进制程序特定位置的 slice。这也就是为什么字符串字面量是不可变的;&str 是一个不可变引用。

详情查看:https://www.rustwiki.org.cn/zh-CN/book/ch04-03-slices.html

作者:AlbertWen  添加时间:2026-07-02 19:29:12  修改时间:2026-07-07 23:51:44  分类:01.Rust编程  编辑

哪些类型实现了 Copy trait 呢?

任何一组简单 标量值(基础数据类型) 的组合都可以实现 Copy,任何不需要分配内存或某种形式资源的类型都可以实现 Copy 。如下是一些 Copy 的类型:

  • 所有整数类型,比如 u32
  • 所有浮点数类型,比如 f64
  • 布尔类型,bool,它的值是 true 和 false
  • 字符类型,char
  • 元组,当且仅当其包含的类型也都实现 Copy 的时候。比如,(i32, i32) 实现了 Copy,但 (i32, String) 就没有。

详情查看:https://www.rustwiki.org.cn/zh-CN/book/ch04-01-what-is-ownership.html

作者:AlbertWen  添加时间:2026-07-02 10:18:16  修改时间:2026-07-08 04:33:33  分类:01.Rust编程  编辑

基础数据类型

  1. 标量类型
    1. 整数
    2. 浮点数
    3. 布尔类型
    4. 字符类型
  2. 复合类型
    1. 元组类型
    2. 数组类型

详情查看:https://www.rustwiki.org.cn/zh-CN/book/ch03-02-data-types.html

作者:AlbertWen  添加时间:2026-07-02 09:57:36  修改时间:2026-07-07 20:19:35  分类:01.Rust编程  编辑

基于 Salvo 的项目架构,我建议不要按“框架目录”来分,而是按 业务模块 + 分层架构 来组织。Salvo 本身的核心比较轻:Router 负责路由树,Handler 既可以做接口处理器,也可以做中间件;中间件通过 Router::hoop() 挂载,并会影响当前路由及其子路由。(Salvo)

作者:AlbertWen  添加时间:2026-06-07 22:34:02  修改时间:2026-07-05 17:20:55  分类:01.Rust编程  编辑

我先按“它们分别处在网络栈的哪一层”来解释,这样最容易区分:rustls 负责 TLS 加密,hyper 负责 HTTP 协议,axum 负责 Web 应用路由与业务处理。

可以把它们理解成 Rust Web/网络服务开发里的三层东西

浏览器 / 客户端
   |
HTTPS / TLS 加密层  ← rustls
   |
HTTP 协议层         ← hyper
   |
Web 路由 / 业务层    ← axum
   |
你的业务代码