Rust从入门到实战系列二百七十五:枚举 Enum

本文介绍了Rust编程中的枚举特性,包括显式整数赋值、枚举成员类型多样性、模式匹配、类型统一化以及如何用Option枚举处理空值。还展示了如何使用枚举实现链表数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🌟🌟 在创建枚举时,你可以使用显式的整数设定枚举成员的值。
// 修 复 错 误
enum Number {
Zero,
One,
Two,
}
enum Number1 {
Zero = 0,
One,
Two,
}
// C语 言 风 格 的 枚 举 定 义
enum Number2 {
Zero = 0.0,
One = 1.0,
Two = 2.0,
}
fn main() {
// 通 过 as 可 以 将 枚 举 值 强 转 为 整 数 类 型
assert_eq!(Number::One, Number1::One);
assert_eq!(Number1::One, Number2::One);
}
2. 🌟 枚举成员可以持有各种类型的值
// 填 空
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
fn main() {
let msg1 = Message::Move{}; // 使 用x = 1, y = 2 来 初 始 化
let msg2 = Message::Write(
); // 使 用 “hello, world!” 来 初 始 化
}
3. 🌟🌟 枚举成员中的值可以使用模式匹配来获取
// 仅 填 空 并 修 复 错 误
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
fn main() {
let msg = Message::Move{x: 1, y: 2};
if let Message::Move{} = msg {
assert_eq!(a, b);
} else {
panic!(“不 要 让 这 行 代 码 运 行 !”);
}
}
4. 🌟🌟 使用枚举对类型进行同一化
// 填 空 , 并 修 复 错 误
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
fn main() {
let msgs: __ = [
Message::Quit,
Message::Move{x:1, y:3},
Message::ChangeColor(255,255,0)
];
for msg in msgs {
show_message(msg)
}
}
fn show_message(msg: Message) {
println!(“{}”, msg);
}
5. 🌟🌟 Rust 中没有 null ,我们通过 Option 枚举来处理值为空的情况
// 填 空 让 println 输 出 , 同 时 添 加 一 些 代 码 不 要 让 最 后 一 行 的 panic 执 行 到
fn main() {
let five = Some(5);
let six = plus_one(five);
let none = plus_one(None);
if let __ = six {
println!(“{}”, n)
}
panic!(“不 要 让 这 行 代 码 运 行 !”);
}
fn plus_one(x: Option) -> Option {
match x {
__ => None,
__ => Some(i + 1),
}
}
6. 🌟🌟🌟🌟 使用枚举来实现链表.
// 填 空 , 让 代 码 运 行
use crate::List:😗;
enum List {
// Cons: 链 表 中 包 含 有 值 的 节 点 , 节 点 是 元 组 类 型 , 第 一 个 元 素 是 节 点 的 值 , 第 二 个 元 素 是 指 向
Cons(u32, Box),
// Nil: 链 表 中 的 最 后 一 个 节 点 , 用 于 说 明 链 表 的 结 束
Nil,
}
// 为 枚 举 实 现 一 些 方 法
impl List {
// 创 建 空 的 链 表
fn new() -> List {
// 因 为 没 有 节 点 , 所 以 直 接 返 回 Nil 节 点
// 枚 举 成 员 Nil 的 类 型 是 List
Nil
}
// 在 老 的 链 表 前 面 新 增 一 个 节 点 , 并 返 回 新 的 链 表
fn prepend(self, elem: u32) -> __ {
Cons(elem, Box::new(self))
}
// 返 回 链 表 的 长 度
fn len(&self) -> u32 {
match *self {
// 这 里 我 们 不 能 拿 走 tail 的 所 有 权 , 因 此 需 要 获 取 它 的 引 用
Cons(_, __ tail) => 1 + tail.len(),
// 空 链 表 的 长 度 为 0
Nil => 0
}
}
// 返 回 链 表 的 字 符 串 表 现 形 式 , 用 于 打 印 输 出
fn stringify(&self) -> String {
match *self {
Cons(head, ref tail) => {
Cons(head, ref tail) > {
// 递 归 生 成 字 符 串
format!(“{}, {}”, head, tail.
())
},
Nil => {
format!(“Nil”)
},
}
}
}
fn main() {
// 创 建 一 个 新 的 链 表(也 是 空 的)
let mut list = List::new();
// 添 加 一 些 元 素
list = list.prepend(1);
list = list.prepend(2);
list = list.prepend(3);
// 打 印 列 表 的 当 前 状 态
println!(“链 表 的 长 度 是: {}”, list.len());
println!(“{}”, list.stringify());
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值