枚举
枚举允许列举所有可能的值来定义一个类型。
定义枚举
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) {}
}