商城手機網(wǎng)站制作口碑營銷有哪些
喜歡的話別忘了點贊、收藏加關(guān)注哦,對接下來的教程有興趣的可以關(guān)注專欄。謝謝喵!(=・ω・=)
6.1.1. 什么是枚舉
枚舉允許我們列舉所有可能的值來定義一個類型。這與其他編程語言中的枚舉類似,但 Rust 的枚舉更加靈活和強大,因為它們可以關(guān)聯(lián)數(shù)據(jù)和方法,類似于其他語言中的類或結(jié)構(gòu)體。
6.1.2. 定義枚舉
舉個例子,比如說IP地址無非就只有2種——IPv4和IPv6,要么是IPv4要么是IPv6,這種情況就非常適合使用枚舉類型,因為枚舉的值也只能是它所有變體(枚舉所有可能的值)里的一個。
enum IpAddrKind{V4,V6,
}
這個代碼使用enum
關(guān)鍵字聲明了一個叫IpAddrkind
的枚舉類型,它有兩個類型——一個是V4
,一個是V6
,分別代表IPv4和IPv6。
6.1.3. 枚舉值
表示(創(chuàng)建)枚舉值非常簡單,格式為枚舉類型的名字::變體
,例如:
let four = IpAddrKind::V4;
let six = IpAddrKind::V6;
枚舉的變體都在其標識符所在的空間下,它的標識符就是這個枚舉類型的名。
我們可以聲明一個函數(shù),它接收IpAddrKind
這個類型作為它的參數(shù),而傳遞的值就即可以是V4
也可以是V6
:
fn route(ip_addr: IpAddrKind) { match ip_addr { IpAddrKind::V4 => println!("IPv4"), IpAddrKind::V6 => println!("IPv6"), }
}
讓我們試試效果:
整體代碼:
enum IpAddrKind{ V4, V6,
} fn main() { let four = IpAddrKind::V4; let six = IpAddrKind::V6;// 調(diào)用函數(shù) route(four); route(six); route(IpAddrKind::V4);
} fn route(ip_addr: IpAddrKind) { match ip_addr { IpAddrKind::V4 => println!("IPv4"), IpAddrKind::V6 => println!("IPv6"), }
}
輸出:
IPv4
IPv6
IPv4
6.1.3. 將數(shù)據(jù)附加到枚舉的變體中
枚舉類型是一種自定義的數(shù)據(jù)類型,所以它可以作為結(jié)構(gòu)體里面字段的類型,例如:
struct IpAddr { kind: IpAddrKind, address: String,
}
IpAddr
下的Kind
的類型是IpAddrKind
,存儲網(wǎng)絡(luò)協(xié)議;它的另一個字段address
是字符串類型,存儲具體的IP地址。
通過這樣的結(jié)構(gòu)體,我們可以在main()
函數(shù)中聲明一些存儲IPv4、IPv6信息的變量:
fn main() { let home = IpAddr { kind: IpAddrKind::V4, address: String::from("127.0.0.1"), }; let loopback = IpAddr { kind: IpAddrKind::V6, address: String::from("::1"), };
}
Rust允許數(shù)據(jù)直接附加到枚舉的變體中,例如:
enum IpAddr {V4(String),V6(String),
}
在每個變體的后邊加上一個類型(不一定都是同一個類型)。例如這里V4
和V6
這兩個變體后都跟了String
類型。
這種做法的優(yōu)點是:
- 不需要額外使用struct
- 每個變體可以擁有不同的類型以及相關(guān)聯(lián)的數(shù)據(jù)量
比如說:
enum IpAddr {V4(u8, u8, u8, u8),V6(String),
}
IPv4實際上是由4個32位的數(shù)字(也就是u8
的容量)組成的,而IPv6是字符串,所以就應(yīng)該使用String
。如果我們想要將V4
地址存儲為四個u8
值,但仍將V6
地址表示為一個String
值,我們將無法使用結(jié)構(gòu)體。枚舉可以輕松處理這種情況。
我們來重寫一下6.1.3中的代碼:
enum IpAddrKind{ V4(u8, u8, u8, u8), V6(String),
} fn main() { let home = IpAddrKind::V4(127, 0, 0, 1); let loopback = IpAddrKind::V6(String::from("::1"));
}
確實比前文的代碼少多了。
6.1.4. 標準庫中的IpAddr
事實上,標準庫中就提供了關(guān)于IP地址的枚舉類型,看一下官方是怎么寫的
struct Ipv4Addr {// --snip--
}struct Ipv6Addr {// --snip--
}enum IpAddr {V4(Ipv4Addr),V6(Ipv6Addr),
}
Ipv4Addr
和Ipv6Addr
的內(nèi)容這里沒有寫出來,但這不是重點。重點是此代碼說明任何類型的數(shù)據(jù)放入枚舉變體中都是可以的:例如字符串、數(shù)字類型或結(jié)構(gòu)。甚至可以包含另一個枚舉。
6.1.5. 在枚舉類型使用方法(Method)
方法(Method)的概念在上一個文章中就有涉及,這里不過多闡述。定義方法使用impl
關(guān)鍵字,如下例:
enum Message {Quit,Move { x: i32, y: i32 },Write(String),ChangeColor(i32, i32, i32),
}
impl Message {fn call(&self) {println!("Something happens");}
}
fn main(){let m = Message::Write(String::from("hello"));m.call();
}
該枚舉有四種不同類型的變體:
Quit
:沒有關(guān)聯(lián)任何數(shù)據(jù)。Move
:包含了一個匿名的結(jié)構(gòu)體。Write
:包含一個String
。ChangeColor
:包括三個i32
值。
在主函數(shù)里聲明了變量m
為Message
這個枚舉類型下的Write
變體,并且附帶了String
類型的hello
。然后又在m
上使用了方法call
,就會打印Something happens
。