在rust中使用enum枚举,可以让枚举的变量使用不同的数据类型,相当方便。但是你知道么?想通过enum获取其变量值,也不是一件容易的事情,总之,是一件相当恼人的事情。
今天,本人专门为解决此问题,写下这篇杂文,希望大家少走弯路。
一、基础代码
use std::fmt;
#[derive(Debug)]
enum myip{
ipv4(String),
ipv6(String),
}
上述的代码就定义一个枚举呗,该对象包括两个变量,其类型都为String。
以下内容所涉及的都与上述基础代码有关。
二、构造并输出如上的enum枚举
let v4=myip::ipv4(String::from("192.168.3.9"));
let v6=myip::ipv6(String::from("::1"));
println!("V4的内容是: {:?}", v4);
println!("V6的内容是: {:?}", v6);
//如上代码运行后,输出内容是:
V4的内容是: ipv4("192.168.3.9")
V6的内容是: ipv6("::1")
请认真看清楚,输出的是类似ipv4("192.168.3.9")的内容,根本就不是 192.168.3.9 这样的内容,所以,你想拿它去进行各种判断或处理,难喽。并且,想要获取 192.168.3.9 这样的值,不费一点功夫,根本不可能。下面,继续为大家介绍。
三、获取enum枚举变量的值
要想获取值,得使用impl关键字。
在上面的代码基础上,增加如下代码:
impl fmt::Display for myip {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
myip::ipv4(a) => write!(f, "{}", a),
myip::ipv6(b) => write!(f, "{}", b),
}
}
}
然后,再进行输出:
println!("V4的内容是: {}", v4);
println!("V6的内容是: {}", v6);
运行上述两行代码之后,输出如下内容:
V4的内容是: 192.168.3.9
V6的内容是: ::1
怎么样,现在可以获取值了。
下面,再拿获取的值进行各种处理,就能完成许多业务了。
比如,拿下面的代码试试:
if v4.to_string().contains("192.168.3"){
println!("包含 192.168.3");//这里判断成功,可以输出
}
上面的if也可以这样使用:if v4.to_string() == "192.168.3".to_string()
再比如下面的代码:
match &v4 {
myip::ipv4(_) =>println!("匹配的是v4 {}", v4),//本例匹配此句
myip::ipv6(_) =>println!("匹配的是v6 {}", v6),
_=> println!("无法匹配…"),
}
好了,就讲到这里吧,记得之前也是使用impl获取结构体struct的值,与此文类似,若想学习,请搜索 impl 即可。
四、知识拓展
想了解更多的enum,请参阅读下文。
#[derive(Debug)]
enum infor{
work,
rmb,
}
fn getinforvalue(x:infor)->i32{
match x{
infor::work => 1900,
infor::rmb => 5600,
_=> 0,
}
}
fn main() {
println!("开始了…");
let i1=getinforvalue(infor::rmb);
println!("i1 is {:?}",i1);
if i1==5600{
println!("判断相等了…");
}
let i1=getinforvalue(infor::work);
println!("i1 is {:?}",i1);
}