Rust中的枚举是一组类型的枚举,或者可以说是多个子类型公用一个枚举类型。适用的场景是:一组有着共同点的类型,但是每个类型又有许多不同,而且同一时刻相互之间互斥。
基本使用介绍
比如:IP有两个版本,IPV6 & IPV4。这两个版本同样是IP的版本号,并且同一个值只会是其中一种类型,那么这时候就可以使用枚举。定义方式如下。
enum IpAddrKind {
V4,
V6,
}
使用Enum实例化变量
fn main() {
let four = IpAddrKind::V4;
let six = IpAddrKind::V6;
}
V4和V6在函数传参的时候,都可以算作一个类型 IpAddrKind。
enum IpAddrKind {
V4,
V6,
}
fn route(ip_kind: IpAddrKind) {}
fn main() {
route(IpAddrKind::V4);
route(IpAddrKind::V6);
}
在枚举中添加类型
接着👆的例子,我们可以进一步这样定义枚举
enum IpAddr {
V4(String),
V6(String),
}
这样就可以直接将具体的值添加到枚举变量中
enum IpAddr {
V4(String),
V6(String),
}
fn main(){
let home = IpAddr::V4(String::from("127.0.0.1"));
}
在枚举中添加的类型是多样的,可以是tuple、struct,甚至可以是另一个枚举。
enum IpAddr {
V4(u8, u8, u8, u8),
V6(String),
}
fn main(){
let home = IpAddr::V4(127, 0, 0, 1);
let loopback = IpAddr::V6(String::from("::1"));
}
另一个例子
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
给enum添加impl
我们可以给struct添加impl,定义funcitons,同样也可以使用在enum上。
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
impl Message {
fn call(&self) {
// method body would be defined here
}
}
fn main(){
let m = Message::Write(String::from("hello"));
m.call();
}
这样给数据类型带来了极大的丰富性。