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,同样打印出来。

相关推荐
Naylor15 小时前
只借不占:Rust 的引用与借用
后端·rust
对象存储与RustFS20 小时前
RustFS 后台扫描器与自愈调参:五档速度、位腐检测周期与并发上限
后端·rust·开源
q平面人1 天前
【总工笔记】mindoc平板、桌面端笔记软件,发布到mindoc服务端
rust·tauri·华为平板·mindoc·总工笔记
MC皮蛋侠客1 天前
Tauri 2.x 系列(九):安全模型——Capabilities、Permissions、Scope 与 CSP
rust·tauri
Source.Liu1 天前
【Dioxus】Windows 环境下 Rust + Dioxus 安装配置笔记
windows·rust·dioxus
zLLM_Lab2 天前
不装 Python/PyTorch:8.1 MB Rust 程序在 MacBook Air M5 跑多模态大模型
rust
梦醒沉醉2 天前
std1.97.1——result模块细览
rust
Thneonl2 天前
同一资源、不同 ID:多源拓扑的 Identity Resolution
架构·rust
绍磊leo2 天前
【保姆级】dora-rs 一键安装脚本:类ros2的fishros 风格交互菜单 + 国内镜像加速,把坑都替你踩完了
rust·dora-rs
Ramble_Naylor2 天前
只借不占:Rust 的引用与借用
开发语言·rust