枚举类型,简称枚举,允许列举所有可能的值来定义一个类型。
枚举类型:已知所有可能的值,并且所有值的出现是互斥的,即每次只能取一种可能的值,才使用枚举类型。
示例:声明一个枚举
enum IpAddrKind{
V4,
V6,
}
使用IpAddrKind中的两个变体来创建实例:
let four = IpAddrKind::V4;
let six = IpAddrKind::V6;
注:枚举的变体全部处于其标识符的命名空间内,并使用两个冒号将标识符和变体分隔开。
枚举允许直接将其相关联的数据嵌入枚举变体内,这样就可以更简单的表达意思。示例:
enum IpAddr{
V4(String),
V6(String),
}
let home = IpAddr:V4(String::from("127.0.0.1"));
let loopback = IpAddr::V6(String::from("::1"));
可以直接将数据附加到枚举的每个变体中,这样就不需要额外的使用结构体了。
使用枚举还可以让每个变体拥有不同类型和数量的关联数据。
示例:
enum IpAddr{
V4(u8,u8,u8,u8),
V6(String),
}
let home = IpAddr::V4(127.0.0.1);
let loopback = IpAddr::V6(String::from("::1"));
在Rust中虽然没有空值的概念,但是却提供了一个拥有类似概念的枚举,可以使用它来标识一个值的无效或缺失。这个枚举就是Option
,它在标准库中的定义如下:
enum Option<T>{
Some(T),
None,
}
这里的
表示一种泛型,即可以指代任意类型的数据。
因为Option
和T(T表示任意数据类型)
是不同的类型,因此编译器不允许像使用普通值一样去直接使用Option
的值。
Rust中存在一个控制流运算符:match,它允许将一个值与一系列的模式相比较,并根据匹配的模式执行相应的代码。模式可以由字面量、变量名、通配符和其他组成。
示例:
enum Coin {
Penny,
Nickel,
Dime,
Quarter,
}
fn value_in_cents(coin:Coin) -> u32{
match coin{
Coin::Penny => 1,
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter => 25,
}
}
使用match
进行匹配时,必须穷举所有的可能,来确保代码的合法性。
_
通配符:当不需要处理所有可能的值的时候,可以使用_
通配符去匹配其余值。
示例:
let some_u8_value = 0u8;
match some_u8_value{
1 => println!("one"),
3 => println!("three"),
5 => println!("five"),
_ => (),
}
这里的_
可以匹配任何值,将_
放在其他分支后面,可以帮助匹配所有没有被显式指定出来的情形。
if let
能够用来处理只关心某一种匹配而忽略其他匹配的情况。
示例:
使用match进行匹配:
let some_u8_value = Some(0u8);
match some_u8_value{
Some(3) => println!("three"),
_ => (),
}
使用if let
进行改写:
let some_u8_value = Some(0u8);
if let Some(3) = some_u8_value{
println!("three"),
}