浅谈rust枚举(enum)
先用一句话来概括枚举的优势:可以处理同一类的不同类型和数量的数据。
原文是:每个成员可以处理不同类型和数量的数据
我加上了半句,突出同一类。
原文:https://blog.csdn.net/weixin_44259356/article/details/104007741
借用下官方文档的例子:
假设我们要处理 IP 地址
ip地址主要分为ipv4,和ipv6,如果是用java或者c++等面向对象的语言,我们首先应该创建一个类,类里应该有addr属性,用来存放地址,然后还应该有相应的get,set方法来获取和修改地址的值。为了同时保存v4和v6的地址,addr类型必须是String。
那么问题来了。v4总是含有4个在0到255之间的值,v6则是16进制,用8个值来表示,如果都用string则不方便管理了。
如果说用继承呢,先创建一个ip地址的父类,然后再创建两个ip地址的子类,ipv4和ipv6。再为每一个子类单独创建一个addr。
那么问题又来了,子类对于父类只能隐藏属性,并不能覆盖,这样就不能使用多态了。
以上问题,使用rust的enum就能很好的解决了,代码如下:
创建一个枚举
enum IpAddr {
V4(u8, u8, u8, u8),
V6(String),
}
v4和v6都为同一类型(IpAddr),只是成员分别为v4和v6,这样ip地址使用rust枚举就能很好的体现了。
枚举的赋值
let home = IpAddr::V4(127, 0, 0, 1);
let loopback = IpAddr::V6(String::from("::1"));
注:枚举的成员位于其标识符的命名空间中,并使用两个冒号分开。
枚举的取值
直接打印
println!("{:#?}", home);
println!("{:#?}", loopback);
注:直接打印要通过注解标注枚举如下
#[derive(Debug)]
enum IpAddr {
V4(u8, u8, u8, u8),
V6(String),
}
通过match
match home {
IpAddr::V4(a,b,c,d) => println!("值为:{},{},{},{}",a,b,c,d),
IpAddr::V6(date) => println!("{}",date),
}
match loopback {
IpAddr::V4(a,b,c,d) => println!("值为:{},{},{},{}",a,b,c,d),
IpAddr::V6(date) => println!("{}",date),
}
通过if let
if let IpAddr::V4(a,b,c,d) = home {
println!("值为:{},{},{},{}",a,b,c,d)
}
else {
}