11_rust_枚举
枚举
枚举允许列举所有可能的值来定义一个类型。
定义枚举
enum Color {
RED,
BLUE,
}
fn main() {
let red = Color::RED; // 定义一个枚举值
test_enum(red);
test_enum(Color::BLUE);
}
fn test_enum(e: Color) {}
将数据附加到枚举的变体中
enum IpAddr {
V4(String),
V6(String),
}
像这样,可对枚举的每个值附加数据类型,这样就不用像其他语言一样用额外的struct类包装枚举类型了。
优点:
- 不需要额外使用struct
- 每个变体可拥有不同的类型以及关联的数据量
如
enum IpAddr {
V4(u8, u8, u8, u8),
V6(String),
}
fn main() {
let v4 = IpAddr::V4(192.168.1.1);
let v6 = IpAddr::V4(String::from("::1"));
}
再比如rust标准库中的IpAddr的定义:
struct Ipv4Addr {}
struct Ipv6Addr {}
enum IpAddr {
V4(Ipv4Addr),
V6(Ipv6Addr),
}
也可以是多种数据类型
enum Msg {
Quit, // 没有关联任何数据类型
Move {x: i32, y: i32},
Write(String),
Change(i32, i32, i32),
}
枚举定义方法
和struct一样,也是在impl代码块中定义枚举,第一个参数也是self。
enum Msg {
Quit, // 没有关联任何数据类型
Move {x: i32, y: i32},
Write(String),
Change(i32, i32, i32),
}
impl Msg {
fn test(&self) {}
}
Option枚举
- 定义于标准库中,在Prelude(预导入模块)中,描述了某个值可能存在(某种类型)或不存在的情况。
rust语言没有null。在其他语言使用null表示没有值(null本身是个值),有null的语言中一个变量可处于空(null)、非空两种状态。但null的问题在于,当你尝试像使用非null值一样使用null值时,程序就容易引起某种错误,比如null无法操作字符串等报错。null的概念主要作用是用于表示因某种原因而变为无效或缺失的值。
所以rust提供了类似于Null概念的枚举:
Option<T>
// 标准库中的定义:
enum Option<T> { //T是枚举
Some(T),
None
}
它包含在Prelude(预导入模块)中,可直接使用:
Option<T>
Some(T)
None
例子
fn main() {
let some_num = Some(5); // 编译器推断出i32类型
let some_str = Some("a str"); // 推断出&str类型
let none_ty: Option<i32> = None; // 因是None,无法推断出是什么类型,故需要手动指明
}
Option<T>比Null更好的地方:
Option<T>
和T是不同类型,不能把Option<T>
直接当成T使用。
fn main() {
let x: Option<i8> = Some(5);
let y: i8 = 3;
let sum = x + y; // 编译报错:cannot add Option<i8> to i8
}
若要使用Option<T>
中的T,必须将它转换为T。这样可避免其他语言中的假设某个值存在,但却为Null时的运行时错误。
比如其他语言可能有
string a = null; string b = a + "123";