30天拿下Rust之结构体

简介: 在Rust语言中,结构体是一种用户自定义的数据类型,它允许你将多个相关的值组合成一个单一的类型。结构体是一种复合数据类型,可以用来封装多个不同类型的字段,这些字段可以是基本数据类型、其他结构体、枚举类型等。通过使用结构体,你可以创建更复杂的数据结构,并定义它们的行为。

概述

在Rust语言中,结构体是一种用户自定义的数据类型,它允许你将多个相关的值组合成一个单一的类型。结构体是一种复合数据类型,可以用来封装多个不同类型的字段,这些字段可以是基本数据类型、其他结构体、枚举类型等。通过使用结构体,你可以创建更复杂的数据结构,并定义它们的行为。


结构体的定义

在Rust中,可以使用struct关键字来定义结构体。结构体的基本形式如下。

struct StructName {
    field1: FieldType1,
    field2: FieldType2,
    // 更多字段
}

注意:与C/C++不同,Rust里的struct语句仅用来定义,不能声明实例;struct的结尾不需要分号,且每个字段定义之后用逗号进行分隔。

在下面的示例代码中,我们定义了一个结构体Person。它有两个字段,一个字段为name,字符串类型,另一个字段为age,32位整型。

struct Person {
    name: String,
    age: i32,
}


结构体的使用

要使用结构体,我们需要先创建结构体的实例(即对象)。创建方法为:使用结构体名称并跟上大括号{},在大括号中指定每个字段的值。具体可参考下面的示例代码。

let person = Person{name: String::from("Mike"), age: 16};

如果我们想要赋值的变量名称与结构体中的字段名称完全相同,则可以省略字段名称。否则,编译时会提示错误信息:unknown field。

struct Person {
    name: String,
    age: i32,
}
fn main() {
    let name = String::from("Mike");
    let age = 16;
    let person = Person{name, age};
    let name2 = String::from("Jack");
    // name2与结构体中的name不相同,会提示编译错误:unknown field
    let person2 = Person{name2, age};
}

创建好结构体的实例后,我们可以通过点号.来访问结构体字段。

println!("{}: {}", person.name, person.age);

结构体的字段可以是可变的,也可以是不可变的。默认情况下,结构体的字段不可变。如果需要修改结构体的字段,需要使用mut关键字让其成为可变。

struct Point {
    x: i32,
    y: i32,
}
fn main() {
    let p = Point { x: 100, y: 200 };
    // 编译报错:cannot assign
    p.x = 15;
    
    // 使用mut关键字后,可修改结构体的字段
    let mut p2 = Point { x: 100, y: 200 };
    p2.x = 15;
}


结构体绑定方法

在Rust中,结构体可以绑定方法。这些方法与结构体紧密关联,允许你以面向对象的方式操作结构体的实例。方法定义在impl块中,该块指定了方法所属的类型。我们结合下面的示例代码,来进一步说明结构体如何绑定方法,以及如何使用这些方法。

struct Rectangle {
    width: u32,
    height: u32,
}
impl Rectangle {
    fn new(width: u32, height: u32) -> Self {
        Self { width, height }
    }
  
    fn area(&self) -> u32 {
        self.width * self.height
    }
    fn print_basic_info() {
        println!("This is a rectangle");
    }
}
fn main() {
    Rectangle::print_basic_info();
    let rect = Rectangle::new(66, 10);
    let area = rect.area();
    println!("Area: {}", area);
}

在上面的示例代码中,我们为Rectangle结构体定义了三个方法。

new:这是一个静态方法,用于创建并返回一个新的Rectangle实例,对应C++、Java等面向对象编程语言中的构造函数。它使用了Self关键字来指代结构体自身,这是一种在Rust中引用当前实现类型的方式。

area:这个方法是一个实例方法,用于计算并返回矩形的面积。它接受一个指向Rectangle实例的不可变引用&self作为参数,这样它就可以访问实例的字段了。

print_basic_info:这个方法也是一个静态方法,用于打印矩形的基本信息。

在main函数中,我们通过构造函数创建了一个Rectangle的实例,并调用了它的area方法来计算面积。注意:方法的第一个参数通常是一个指向结构体实例的引用(&self、&mut self),这允许方法访问和修改结构体实例的字段。在这个例子中,我们使用的是不可变引用&self,因为我们只读取字段的值而不修改它们。如果我们需要修改字段,我们会使用可变引用&mut self。

总结一下:绑定到结构体的方法提供了一种面向对象的方式来操作数据,即使Rust是一种基于函数的编程语言,而不是传统的面向对象语言。


结构体更新语法

在Rust中,如果你想从一个现有的结构体实例创建另一个新的实例,并在此过程中更新某些字段的值,你可以使用结构体的更新语法。这种语法使用..运算符(也称为点运算符或展开运算符),允许你复制一个现有的结构体实例,并仅更改你需要修改的字段。

struct Person {
    name: String,
    age: u32,
    city: String,
}
fn main() {
    let person1 = Person {
        name: String::from("Tank"),
        age: 23,
        city: String::from("London"),
    };
    let person2: Person = Person {
        name: String::from("Mike"),
        ..person1
    };
    println!("name: {0}, age: {1}, city: {2}", person2.name, person2.age, person2.city);
}

在上面的示例代码中,person1是一个Person类型的实例。我们想要创建一个新的Person实例person2,它的 age和city字段与person1相同,但name字段需要更新为"Mike"。通过使用..运算符,我们就不需要手动复制age和city字段的值,而只需要指定要更新的name字段。


相关文章
|
3月前
|
Rust 索引
【Rust学习】08_使用结构体代码示例
为了了解我们何时可能想要使用结构体,让我们编写一个计算长方形面积的程序。我们将从使用单个变量开始,然后重构程序,直到我们改用结构体。
102 2
|
3月前
|
存储 Rust 编译器
【Rust学习】07_结构体说明
**struct**或 ***structure***是一种自定义数据类型,允许您命名和包装多个相关的值,从而形成一个有意义的组合。如果您熟悉面向对象的语言,那么**struct**就像对象中的数据属性。在本章中,我们将比较和对比元组与结构体,在您已经知道的基础上,来演示结构体是对数据进行分组的更好方法。
33 1
|
6月前
|
存储 Rust 程序员
Rust结构体详解:定义、使用及方法
Rust结构体详解:定义、使用及方法
|
7月前
|
Rust 安全 算法
【深入探索Rust:结构体、枚举与模式匹配】A Deep Dive into Rust: Structs, Enums, and Pattern Matching
【深入探索Rust:结构体、枚举与模式匹配】A Deep Dive into Rust: Structs, Enums, and Pattern Matching
105 0
【深入探索Rust:结构体、枚举与模式匹配】A Deep Dive into Rust: Structs, Enums, and Pattern Matching
|
7月前
|
存储 Rust 开发者
【Rust】——结构体struct
【Rust】——结构体struct
|
7月前
|
存储 Rust 算法
Rust 数据类型 之 结构体(Struct)
Rust 数据类型 之 结构体(Struct)
150 0
|
7月前
|
存储 Rust 安全
Rust 笔记:Rust 语言中的 结构体 与面向对象编程的实现
Rust 笔记:Rust 语言中的 结构体 与面向对象编程的实现
111 0
|
7月前
|
存储 Rust C++
Rust 语言中的结构体
Rust 语言中的结构体
|
存储 JSON Rust
【RUST学习日记】第22课 结构体(上)
【RUST学习日记】第22课 结构体(上)
|
存储 Rust 安全
Rust 笔记:Rust 语言中的 结构体
本文先介绍 Rust 语言中的 结构体 的基本用法,然后重点介绍了在 Rust 语言中通过结构体实现面向对象编程的思想、方法并给出了相当多的代码示范。
219 1