浅谈rust枚举(enum)

浅谈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 {
    
}
发布了46 篇原创文章 · 获赞 6 · 访问量 9393

猜你喜欢

转载自blog.csdn.net/weixin_44259356/article/details/104007741