学习笔记
Git
  • C#
  • F#
  • AspNetCore
  • EF Core
  • WPF
  • Tauri
  • IoTDB
  • Redis
  • Docker
  • Kubernetes
  • RabbitMQ
  • 日志

    • NLog的配置文件
Linux
基础设施
  • Vue

    • Vue基础
VS Code的插件与玩法
Rust
Python
  • Maven
  • Spring Boot
实际项目
我的博客
Git
  • C#
  • F#
  • AspNetCore
  • EF Core
  • WPF
  • Tauri
  • IoTDB
  • Redis
  • Docker
  • Kubernetes
  • RabbitMQ
  • 日志

    • NLog的配置文件
Linux
基础设施
  • Vue

    • Vue基础
VS Code的插件与玩法
Rust
Python
  • Maven
  • Spring Boot
实际项目
我的博客
  • Rust中的变量
  • 数据类型
  • 函数
  • 控制流
  • 所有权
  • 结构体

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

struct User {
    active: bool,
    username: String,
    email: String,
    sign_in_count: u64,
}

结构体赋值

fn build_user(email: String, username: String) -> User {
    User {
        active: true,
        username: username,
        email: email,
        sign_in_count: 1,
    }
}

简化赋值

Rust在给结构体赋值时可以简化,行为与JavaScript类似

fn build_user(email: String, username: String) -> User {
    User {
        active: true,
        username,
        email,
        sign_in_count: 1,
    }
}

当参数与结构体的字段同名时,可以简化写法

从其他实例创建实例

fn main() {
    // --snip--

    let user2 = User {
        email: String::from("[email protected]"),
        ..user1
    };
}

当需要从一个实例创建另一个实例时,除了常规的每个字段都进行赋值,还可以选择这种结构体更新语法,近指定需要变化的字段,然后解构原来的结构体(与JavaScript中的解构赋值类似)

特殊的结构体

元组结构体

元组结构体有着结构体名称提供的含义,但没有具体的字段名,只有字段的类型。

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

如果是元组,那么同样的三个整数是没有区分的,但是元组结构体能够表明这里是RGB颜色,还是XYZ坐标

类单元结构体

一个没有任何字段的结构体,它们被称为 类单元结构体(unit-like structs)因为它们类似于 ()

类单元结构体常常在你想要在某个类型上实现 trait 但不需要在类型中存储数据的时候发挥作用。

Last Updated:
Contributors: 吴俊城
Prev
所有权