Rust 结构体

Rust 结构体或 struct 是一种用户定义的复合数据类型,用于将不同类型的数据一起存储。

假设我们要存储一个人的姓名、年龄和身高。为此,我们可以为每个属性/字段创建变量。

let personName: String = String::from("John Doe");
let personAge: u8 = 18;
let personHeight: u8 = 178;

这种方法的缺点是我们必须单独维护所有这些变量。要存储多个人这些字段,我们将不得不为每个人创建不同的变量。

相反,我们可以创建一个结构体,将所有字段作为一个单元存储在一起。例如,

struct Person {
    name: String,
    age: u8,
    height: u8
}

在 Rust 中定义结构体

在 Rust 中,我们使用 struct 关键字来定义结构体。结构体的语法是

struct struct_name {
    field1: data_type,
    field2: data_type,
    field3: data_type
}

这里,

  • struct - 定义结构体的关键字
  • struct_name - 结构体的名称
  • field1: data_type/field2: data_type - 结构体内部字段的名称和数据类型。

让我们看一个例子。

struct Person {
    name: String,
    age: u8,
    height: u8
}

在这里,我们定义了一个名为 Person 的结构体。它包含三个字段

  • name - 数据类型为 String
  • age - 数据类型为 u8
  • height - 数据类型为 u8

实例化 Rust 结构体

要在 Rust 中使用结构体,我们首先必须创建结构体的实例。例如,

// define a structure
struct Person {
    name: String
    age: u8,
    height: u8
}

// create an instance of Person struct
let person1 = Person {
    ...
};

在这里,Person {...} 创建了一个 Person 结构体 的实例,我们将其赋值给了 person1 变量。

我们也可以在创建实例时为结构体字段赋值。例如,

let person1 = Person {
    name: String::from("John Doe"),
    age: 18,
    height: 178
};

在这里,我们初始化了 Person 结构体的 nameageheight 字段的值。此初始化结构体字段值的方法称为结构体实例化

注意: 结构体定义是一个模板,结构体实例用数据填充该模板。


访问结构体的字段

我们可以使用结构体实例和点 . 符号来访问结构体中字段的值。例如,

fn main() {
    // define a Person struct
    struct Person {
        name: String,
        age: u8,
        height: u8
    }
    
    // instantiate Person struct
    let person = Person {
        name: String::from("John Doe"),
        age: 18,
        height: 178
    };
    
// access value of name field in Person struct println!("Person name = {}", person.name); // access value of age field in Person struct println!("Person age = {}", person.age); // access value of height field in Person struct println!("Person height = {}", person.height);
}

输出

Person name = John Doe
Person age = 18
Person height = 178

这里,

  • person.name - 读取 Person 结构体的 name 字段 (John Doe)
  • person.age - 读取 age 字段 (18)
  • person.height - 读取 height 字段 (178)

解构 Rust 结构体的字段

解构是将数据类型(数组、元组等)的字段分解为更小变量的过程。我们可以在 Rust 中将结构体字段分解为更小的变量。

假设我们有一个结构体和一个结构体实例,

struct Person {
    name: String,
    age: u8,
    height: u8
}

let person = Person {
    name: String::from("John Doe"),
    age: 18,
    height: 178
};

我们现在可以使用以下方式进行解构

// destructuring the Person struct
let Person { name, age, height } = person;

现在,我们直接使用字段名来访问 nameageheight 字段

  • name 而不是 person.name
  • age 而不是 person.age
  • height 而不是 person.height

但是,您应该注意,解构时的变量名应与字段名相同。


示例:解构结构体字段

fn main() {
    // define a Person struct
    struct Person {
        name: String,
        age: u8,
        height: u8
    }
    
    // instantiate Person struct
    let person = Person {
        name: String::from("John Doe"),
        age: 18,
        height: 178
    };
    
// destructure Person struct into name, age and height variables let Person { name, age, height } = person;
println!("Person name = {}", name); println!("Person age = {}", age); println!("Person height = {}", height); }

输出

Person name = John Doe
Person age = 18
Person height = 178

这里,解构是通过此表达式完成的,

let Person { name, age, height } = person;

表达式的左侧包含声明,表达式的右侧是结构体实例。

在表达式的左侧,我们为具有字段 nameageheightPerson 结构体进行了 let 声明。在表达式的右侧,我们分配了 Person 的实例化结构体。

结果,我们获取了该人员的 nameageheight 并将其打印到屏幕上。


常见问题

如何在 Rust 中创建可变结构体?

要创建可变的 struct,我们在声明结构体变量时使用 mut 关键字。例如,

fn main() {
    // define a Point struct
    struct Point {
        x: i32,
        y: i32,
    }

// instantiate Point struct to a mutable structure variable let mut point = Point { x: 0, y: 0 };
println!("Before change:"); println!("Point x = {}", point.x); println!("Point y = {}", point.y); // change the value of x field in mutable point struct point.x = 5; println!(); println!("After change:"); println!("Point x = {}", point.x); println!("Point y = {}", point.y); }

输出

Before change:
Point x = 0
Point y = 0

After change:
Point x = 5
Point y = 0
什么是元组结构体?

元组结构体是 元组结构体 的混合体。所有元组结构体都有名称,但它们的字段没有。例如,

fn main() {
    // a tuple struct
    #[derive(Debug)]
struct Point(i32, i32);
// instantiating a tuple struct with values let point = Point(1, 2); println!("{:?}", point); }

输出

Point(1, 2)

在这里,struct Point(i32, i32) 是一个元组结构体,包含两个 i32 类型的字段。

注意: 在结构体定义上方添加 #[derive(Debug)] 以允许 Rust 打印整个结构体。

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战