Rust结构体和枚举类

文章目录

Rust初步上手所有权

元组结构体

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

rust 复制代码
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。

结构体

完整的结构体,不仅本身有名字,结构体中的成员也可以有名字,并且可以定义成员方法,下面做一个简单的示例。

rust 复制代码
#[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);
}

编译后运行结果如下。

rust 复制代码
>rustc struct.rs
>struct.exe
Hello, world!
I'm John, 12 years old
Person { name: "John", age: 12 }

首先,创建结构体时,其内部结构需要用花括号包裹,并且指定结构体成员的名称和数据类型。

然后,通过impl为结构体绑定成员方法,尽管仍旧通过fn来作为方法的标识,但若调用结构体成员,必须将&self作为结构体的输入参数;如果不添加&self,则被称为关联函数。

最后,结构体在实例化时,通过冒号来绑定成员名和具体的值。其成员方法(有&self参数)由实例来调用,并且省略参数&self;而关联函数则通过结构体的名称和双冒号来调用。

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

枚举类

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

rust 复制代码
#[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);
        },
        Person::Girl { hair_color } => {
            println!("{} hair", hair_color);
        }
    }
}

运行结果如下

rust 复制代码
>enum.exe
Boy { beard_length: 5 }
Girl { hair_color: "red" }
5cm

上面代码中,首先定义了一个枚举类Person,其内部有两个成员,分别是Boy和Girl,其中每一个都是结构体,Boy有一个成员是胡子的长度,Girl封装了一个成员是头发的颜色。

然后在main函数中,分别将枚举类实例化为john和amy。

最后,使用了match语法,如果john是Boy,就取出其中的beard_length,并打印;如果是Gril,就取出其中的hair_color,同样打印出来。

相关推荐
Flynt6 小时前
pnpm 12 换上了 Rust 内核,我拿项目实测了一轮构建速度
rust·vite·前端工程化
传奇开心果编程10 小时前
【Xilem基础语法学与练】第8课:条件渲染(one_of)
学习·rust·前端框架
qwsaedca12 小时前
在Mac上跑 Kokoro TTS经验总结
rust·mac·tts
qwsaedca12 小时前
Kokoro TTS v1.1 voices 文件格式逆向分析
rust
老猿讲编程14 小时前
【Eclipse OpenSOVD学习之五】拓扑引擎(Topology)
学习·rust·eclipse·sovd
object not found15 小时前
Nuxt4去掉body中默认的边距
开发语言·后端·rust
梦醒沉醉1 天前
4、Rust参考手册——Crate和源文件
rust
chainbees1 天前
Windows 系统 Rust 运行环境搭建
rust
k4m7v2pz1 天前
从 Python 搬到 Rust:pyglet MIDI DAW 变成 egui 鬼畜采样器的迁移复盘
开发语言·python·rust