本文介绍了Rust语言中的三种复合数据类型:元组结构体、结构体和枚举类。元组结构体是带名字的元组,通过struct声明并实例化;标准结构体可定义成员和方法,使用impl绑定成员方法;枚举类结合match语法可实现模式匹配,文中展示了包含不同成员变量的枚举定义与使用。这三种数据类型共同构成了Rust强大的类型系统基础,配合println!的调试输出,能有效提升代码可读性和开发效率。

元组结构体

【元组结构体】是最简单的结构体,可以粗暴地理解为是有名字的元组,二者的区别如下。

let tup: (i32, f64, u8) = (500, 6.4, 1);

struct Test(i32, f64, u8);
let t = Test(500,6.4,1)

第一行代码将一个元组绑定给变量tup,而tup要求三个位置的变量分别是32位整型、双精度以及8位无符号整型。

而元组结构体则首先需要有一个名字,通过struct声明结构体并给定不同位置处的数据类型后,再调用结构体的构造函数Test,来新建一个元组结构体,最后绑定给变量t。

结构体

完整的结构体,不仅自身有名字,内部成员也可以有名字,示例如下

#[derive(Debug)]
struct Person{
    name: String,
    age : u8
}

impl Person{
    fn say_hello(){
        println!("Hello, world!");
    }
    fn self_intro(&self){
        println!("I'm {}, {} years old", 
            self.name, self.age);
    }
}

fn main(){
    let john = Person{name: String::from("John"), age:12};
    Person::say_hello();
    john.self_intro();
    println!("{:?}",john);
}
/*运行结果
>rustc struct.rs
>struct.exe
Hello, world!
I'm John, 12 years old
Person { name: "John", age: 12 }
*/

代码中要点如下

  1. 【struct】用于声明结构体的内部结构,需指定成员的名称和数据类型。
  2. 【impl】为结构体绑定成员方法,如需调用结构体成员,必须将【&self】作为结构体的输入参数,否则将被称为关联函数。
  3. 结构体在实例化时,通过冒号来绑定成员名和具体的值。其成员方法(有【&self】参数)由实例来调用,并且省略参数【&self】;关联函数则通过结构体的名称和双冒号来调用。

上面的代码除了展示结构体及其成员方法的定义与构造之外,还在println!中使用了【“{:?}”】形式的占位符,用于更便捷地打印结构体及其成员。

枚举类

枚举是一个非常经典的编程概念,Rust为其适配了match语法,使得枚举类变得有了一些可玩性。

#[derive(Debug)]

enum Person {
    Boy{beard_length: u32},
    Girl{hair_color: String}
}

fn main() {
    let john = Person::Boy{beard_length:5};
    let amy = Person::Girl{hair_color:String::from("red")};
    println!("{:?}\n{:?}", john, amy);
    match john {
        Person::Boy { beard_length } => {
            println!("{}cm", beard_length); //由于john是Boy,故而匹配此项
        },
        Person::Girl { hair_color } => {
            println!("{} hair", hair_color);
        }
    }
}
/*运行结果
>enum.exe
Boy { beard_length: 5 }
Girl { hair_color: "red" }
5cm
*/

上面代码中

  1. 定义了枚举类Person,内部有两个成员,分别是Boy和Girl,二者均为结构体,但成员变量不同,Boy封装了胡子的长度,Girl封装了头发的颜色。
  2. 在main函数中,分别将枚举类实例化为john和amy。
  3. 使用了match语法,如果john是Boy,就取出beard_length,并打印;如果是Gril,则取出hair_color,同样打印出来。正如前面所定义的,John是Boy,所以打印的是胡子长度。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐