📜  struct 的 rust 工具克隆 - Rust (1)

📅  最后修改于: 2023-12-03 14:47:44.184000             🧑  作者: Mango

Rust中的Struct工具介绍

Rust是一种系统级编程语言,并延续了C++和Go的一些风格。它有很多有用的特性,例如内存安全和并发安全,还有很多其他的特性。在Rust中,struct是一种自定义数据类型,它是一种独特的方法来组合数据,并且可以具有自己的方法和关联函数。

Rust Struct的基本使用

Struct定义使用如下方式:

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

其中,name、age和gender是这个结构体的字段。我们可以创建一个新的Person实例,来存储这些字段,如下:

let person = Person { name: String::from("John"), age: 32, gender: 'M' };

我们可以通过点语法获取或修改这个结构体的字段:

println!("Name: {}", person.name); // 输出 Name: John
person.age = 33;
println!("Age: {}", person.age); // 输出 Age: 33

如果要创建一个可变的实例,可以使用mut关键字:

let mut person = Person { name: String::from("John"), age: 32, gender: 'M' };
person.name = String::from("Jack");
println!("Name: {}", person.name); // 输出 Name: Jack
Rust Struct的属性

在Rust中,struct是一种非常有用的数据类型,它可以包含许多不同的属性。Struct的属性可以是以下类型之一:

  • Numbers(数字)
  • Booleans(布尔)
  • Characters(字符)
  • Strings(字符串)
  • Tuples(元组)
  • Arrays(数组)
  • Enums(枚举)
  • Structs(结构体)

如下是一个示例:

struct Person {
    name: String,
    age: u32,
    is_male: bool,
    address: Address,
}

struct Address {
    street: String,
    city: String,
    pin: u32,
}

结构体中的属性可以直接访问,如下:

let person = Person {
    name: String::from("Daniel"),
    age: 26,
    is_male: true,
    address: Address {
        street: String::from("123 Main St."),
        city: String::from("Dallas"),
        pin: 12345,
    },
};

println!("{}", person.name);
println!("{} {}", person.address.street, person.address.city);
派生属性的使用方法

在Rust中,我们可以通过创建派生属性来灵活使用struct的特性。

例如,我们想计算一个人的全名长度,可以直接在struct定义中添加一个派生属性:

use std::fmt::Display;

struct Person {
    first_name: String,
    last_name: String,
    age: u8,
}

impl Person {
    fn full_name(&self) -> String {
        format!("{} {}", self.first_name, self.last_name)
    }
}

impl Display for Person {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.write_str(&format!(
            "{} - Age: {}",
            self.full_name(),
            self.age
        ))
    }
}

fn main() {
    let person = Person {
        first_name: String::from("Daniel"),
        last_name: String::from("Smith"),
        age: 26,
    };

    println!("{}", person);
}

在这个例子中,我们添加了一个full_name方法,它将两个字符串连接起来并返回。我们还通过实现Display trait,使得该struct对象可以直接传递给println!宏,从而输出字符串。

结构体生命周期

在Rust中,每个变量都有其生命周期,而struct也不例外。当结构体被创建时,它的生命周期就开始了。当变量的生命周期结束时,该变量所代表的对象也就被销毁了。

在Rust中,对于struct的生命周期管理有一些约定。默认情况下,struct对象的生命周期由更短的生命周期对象决定。例如,在下面的代码中:

fn main() {
    let name = String::from("John");
    let person = Person { name: &name };

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

在这个例子中,name变量的生命周期结束时,person结构体对象也被销毁了。因此,在println!的第二个参数中使用&person.name是错误的,因为person对象已经不存在了。

为了解决这个问题,我们可以通过使用<'a>来调整生命周期。例如:

struct Person<'a> {
    name: &'a str,
    age: u32,
}

fn main() {
    let name = String::from("John");
    let person = Person { name: &name, age: 32 };

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

在这个例子中,我们使用<'a>来告诉编译器Person结构体对象的生命周期比它的字段生命周期更长,从而避免了在字段生命周期结束时导致的不确定行为。

Rust Struct的模式匹配

在Rust中,我们可以使用模式匹配来处理struct的各种情况。

例如,假设我们想定义一个Car结构体,用于存储汽车的多种信息。

struct Car {
    brand: String,
    model: String,
    year: u32,
}

fn main() {
    let my_car = Car {
        brand: String::from("Toyota"),
        model: String::from("Camry"),
        year: 2019,
    };

    match my_car {
        Car {
            brand: _,
            model: _,
            year: 2020..=2022,
        } => println!("New model!"),
        Car {
            brand: _,
            model: _,
            year: 2000..=2019,
        } => println!("Old model!"),
        _ => println!("Unknown model!"),
    }
}

在这里,我们使用match语句来检查Car对象的年份属性,并根据年份范围来输出不同的文本。

总结

Struct是一种非常有用的数据类型,在Rust中,它可以用来存储大量的信息,并可以方便地进行解构和模式匹配。使用struct,我们可以构建具有清晰结构和强类型的代码,从而大大提高代码的可读性和可维护性。