????????我們經(jīng)常使用let 語句創(chuàng)建新的變量綁定——但是 let 的功能并不僅限于此。事實上, let 語句是一個模式匹配語句。它允許我們根據(jù)內(nèi)部結(jié)構(gòu)對值進(jìn)行操作和判斷,或者可以用于從代數(shù)數(shù)據(jù)類型中提取值。
let tuple = (1_i32, false, 3f32);
let (head, center, tail) = tuple;
????????如上所示,通過第二句,把一個組合數(shù)據(jù)結(jié)構(gòu),拆解開來, 分成了三個不同的變量。在let語句中, =號左邊的內(nèi)容就是模式, =號右邊的內(nèi)容就是需要匹配的內(nèi)容。 相當(dāng)于從tuple變量中,提取了三個新的變量head、 center、 tail, 它們分別對應(yīng)tuple的三個成員。
????????Rust中模式匹配功能遵循的原則:我們怎么把一個數(shù)據(jù)結(jié)構(gòu)組合起來的, 我們就怎么把它拆解開來??梢酝ㄟ^下邊的例子感受一下rust的美感;
struct T1 (i32, char);
struct T2 {
item1: T1,
item2: bool,
}
fn main()
{
let x = T2 {
item1: T1(0, 'A'),
item2: false,
};
let T2 {
item1: T1(value1, value2),
item2: value3,
} = x;
println!("{} {} {}", value1, value2, value3);
}
????????Rust的“模式匹配”功能出現(xiàn)在let、match、if let、 while let、 函數(shù)調(diào)用、 閉包調(diào)用等情景中。
match
? ? ? ? match模式匹配用于流程控制,檢查當(dāng)前值是否匹配一系列模式中的某一個。模式可由字面值、變量、通配符和其他內(nèi)容構(gòu)成。每一個模式都是一個分支,程序根據(jù)匹配的模式執(zhí)行相應(yīng)的代碼。????????
????????Rust要求match模式匹配是窮盡式的,即必須窮舉所有的可能性,否則會導(dǎo)致程序錯誤。有一個處理方法是將通配符“_”放置在其他分支之后,通配符“_”會匹配上面沒有指定的所有可能的模式。
- 豎線(|)可用于在一個 match 分支中組合多個模式;
- 使用 ... 可以匹配某個范圍中的值;
- 使用操作符@可以將模式中的值綁定給一個變量, 供分支右側(cè)的代碼使用, 這類匹配叫綁定模式;使用 if 關(guān)鍵字給 match 分支添加護具。
- 可以使用if作為“匹配看守”(match guards) 。 當(dāng)匹配成功且符合if條件, 才執(zhí)行后面的語句。
- 通配符“_”會匹配上面沒有指定的所有可能的模式。
fn main() {
let age = 6;
match age {
0 => println!("You are a baby."),
1..=7 => println!("You are a toddler."),
8|9|10|11 => println!("You are a schoolchild."),
i if i >= 12 && i<=17 => println!("You are a teenager."),
n @ 18 => println!("You are {}.",n),
19..=100 => println!("You are an adult."),
_ => println!("Cool !"),
}
}
if let&while let
if let和while let表達(dá)式, 在某些場景中可替代match模式匹配來簡化代碼。
相對于match,if let 可以只匹配我們感興趣的值,對于剩下情況可以使用else來繼續(xù)處理。
fn main() {
let value = Some(7);
if let Some(7) = value {
println!("seven"); }
if let Some(v) = value {
println!("Some({})",v);
}else{
println!("None");
}
}
條件循環(huán)while let,它會反復(fù)執(zhí)行同一個模式匹配直到出現(xiàn)失敗的情形。
fn while_let_vec() {
let mut vec = vec![1, 2, 3, 4, 5];
while let Some(value) = vec.pop() {
println!("{}", value);
}
}
函數(shù)參數(shù)(閉包)
通過上邊兩種情況,估計你已經(jīng)大概有一個了解了,我們就直接看例子吧。
struct T {
item1: char,
item2: bool,
}
fn test( T{item1: arg1, item2: arg2} : T) {
println!("{} {}", arg1, arg2);
}
fn main()
{
let x = T {
item1: 'A',
item2: false,
};
test(x);
}
類似于函數(shù)的參數(shù)列表,我們同樣可以在閉包的參數(shù)列表中使用模式。
?
其他(let,for)
????????還有一些場景我們可能也會遇到,不過如果你已經(jīng)理解了模式匹配的規(guī)律,不論是看到還是寫相關(guān)的代碼,估計也是信手拈來。文章來源:http://www.zghlxwxcb.cn/news/detail-704257.html
let文章開始就已經(jīng)介紹了, for可以看一下例子,是不是很自然。文章來源地址http://www.zghlxwxcb.cn/news/detail-704257.html
let v = vec!['a', 'b', 'c'];
for (index, value) in v.iter().enumerate() {
println!("{} is at index {}", value, index);
}
到了這里,關(guān)于RUST 每日一?。耗J狡ヅ涞奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!