定义枚举
简单定义
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);
_ => ...;
}
- 打赏
- 分享




- 微信
- 支付宝