定义枚举

简单定义

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

OptionRust标准库中的一个经典枚举。经典到了什么程度?RustOption 增加了一些语法糖。

enum Option<T>{
	None,
	Some(T),
}

大多数时候,不用写 Option::,直接写Some(T)None 就可以了。

Rust 没有空指针的概念。如果要返回空值、无效值,就可以使用Option结构的None值。而Option<u32>::NoneOption<i32>::None 不是一个东西,不是一个类型,从而保护代码安全。

标准库中Option定义了大量方法可以使用。常用的如 unwrap 取出、mapas**is_someis_none 等。

match

matchrust中用来控制一个值为可能的一组值的一种控制流方式,类似于 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 letrust中是专用关键字,处理类似于 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);
	_ => ...;
}
  • 打赏
  • 分享
分享到...
请选择打赏方式
  • 微信
  • 支付宝

By yhl

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注