定义枚举
简单定义
Rust的枚举初步看来跟其他语言没有什么区别,定义名称、可能的值
enum Color{
Red,
Green,
Blue
}
带值的枚举
文档中的例子让我吃了一惊
enum IpAddr{
V4(String),
V6(String),
}
枚举竟然可以有值。到这一步虽然吃惊,但是还能接受,毕竟枚举一般也可以转换为数字,转换为字符串也没什么。
复杂类型定义的枚举
呃......
enum IdAddr {
V4(u8, u8, u8, u8),
V6(String),
}
枚举里可以带tuple,既然可以带tuple,那么...果然
struct Ipv4Addr{
}
struct Ipv6Addr{
}
enum IpAddr{
V4(Ipv4Addr),
V6(Ipv6Addr),
}
在Rust中,枚举的值可以是任意类型,包括简单结构、复杂结构等。这一点是与其他任何语言(我所认知中的)都不一样的地方,有些类似于C++的Union,但是Union还需要另一个字段来说明使用的具体是哪种类型。
枚举方法
Rust可以给枚举定义方法。像给结构定义一样。
Option
Option是Rust标准库中的一个经典枚举。经典到了什么程度?Rust为Option 增加了一些语法糖。
enum Option<T>{
None,
Some(T),
}
大多数时候,不用写 Option::,直接写Some(T)和 None 就可以了。
在Rust 没有空指针的概念。如果要返回空值、无效值,就可以使用Option结构的None值。而Option<u32>::None和Option<i32>::None 不是一个东西,不是一个类型,从而保护代码安全。
标准库中Option定义了大量方法可以使用。常用的如 unwrap 取出、map、as**、is_some、is_none 等。
match
match是rust中用来控制一个值为可能的一组值的一种控制流方式,类似于 switch。在语法上与python比较像。比较经典的用途是对枚举进行判断。
在分支中,可以控制变量,如:
let opt = Some(10)
match opt {
Some(n) => println!("{n}");
None => println!{"None"};
}
注意:match 要求匹配所有情况,不允许存在某种情况没有分支处理。
最后可以用一个变量表示其他所有匹配,也可以用 _ 来省略。
let x = 10;
match x {
2 => ...;
3 => ...;
n => ...; // 剩余情况。如果n 没有在表达式中被用到,可以写作 "_"
}
如果什么都不想干?可以直接返回 () 。并且在这种情况下,变量也没有意义,所以可以一般写为 _ => ()。由于之前说过,match 必须处理所有可能的情况,所以最后的 _ => ()不能省略。
let x = 10;
match x {
2 => ...;
3 => ...;
_ => ();
}
if let
if let 在rust中是专用关键字,处理类似于 match的语法糖,处理只有一个 match分支或第二个分支是 _ => 的情况。
let config_max = Some(3u8);
if let Some(max) = config_max {
println!("The maxium is configured to be {}", max);
} else {
...;
}
//对应
match config_max{
Some(max) => println!("The maxium is configured to be {}", max);
_ => ...;
}