概述
????????Rust語言以其強大的類型系統(tǒng)和所有權(quán)模型而著稱,而模式與模式匹配則是Rust中一種非常強大且靈活的工具,它允許我們在編譯時根據(jù)數(shù)據(jù)的結(jié)構(gòu)進行條件分支處理。在Rust中,模式是一種用于匹配數(shù)據(jù)的結(jié)構(gòu),它可以是一個具體的值、一個變量綁定、一個枚舉的變體、一個元組、一個結(jié)構(gòu)體或者一個組合模式。模式匹配則是根據(jù)數(shù)據(jù)的結(jié)構(gòu),將數(shù)據(jù)與模式進行匹配,并根據(jù)匹配的結(jié)果執(zhí)行相應(yīng)的代碼塊。
基本模式匹配
????????基礎(chǔ)模式匹配時,可以是常量模式,也可以是變量綁定模式。
????????在下面的示例代碼中,我們有一個常量number,其值為66。我們使用match表達式來檢查number的值。第一個模式66是一個常量模式,它直接匹配整數(shù)值66。如果number的值是66,則執(zhí)行對應(yīng)的代碼塊。如果number的值不是66,則執(zhí)行_通配符模式對應(yīng)的代碼塊。
????????接下來,有一個變量some_number,其類型為Option<i32>,并且它的值為Some(100)。我們使用match表達式來檢查some_number的值。第一個模式Some(x)是一個變量綁定模式,它匹配Option枚舉的Some變體,并將Some中的值綁定到變量x上。如果some_number的值是Some(100),則執(zhí)行對應(yīng)的代碼塊,并打印出"value is: 100"。注意:這里的x是一個新的綁定變量,它只在Some(x)這個模式對應(yīng)的代碼塊中有效。如果some_number的值是None,則執(zhí)行None模式對應(yīng)的代碼塊。
fn main() {
// 常量模式
let number = 66;
match number {
66 => println!("number is 66"),
_ => println!("something else"),
}
// 變量綁定模式
let some_number = Some(100);
match some_number {
// x在此處作為綁定變量
Some(x) => println!("value is: {}", x),
None => println!("no value"),
}
}
結(jié)構(gòu)體和枚舉的模式匹配
????????當使用match表達式處理結(jié)構(gòu)體時,我們可以指定結(jié)構(gòu)體字段的值來進行匹配。
????????在下面的示例代碼中,match表達式中有兩個模式:
????????Point { x: 0, y: 0 }:這個模式試圖匹配一個Point結(jié)構(gòu)體,其中x字段的值為0,y字段的值為0。因為origin的值是Point { x: 66, y: 99 },這個模式不匹配。
????????Point { x, y }:這個模式是一個通配符模式,它會匹配任何Point結(jié)構(gòu)體,并將x和y字段的值綁定到對應(yīng)的變量上。因為第一個模式?jīng)]有匹配成功,所以執(zhí)行這個模式對應(yīng)的代碼塊。
????????在這個模式對應(yīng)的代碼塊中,x和y變量被綁定到了origin的x和y字段的值上,即:x為66,y為99。最后,我們使用println!宏打印出這些值。
struct Point {
x: i32,
y: i32,
}
fn main() {
let origin = Point { x: 66, y: 99 };
match origin {
Point { x: 0, y: 0 } => println!("Origin point"),
Point { x, y } => println!("({}, {})", x, y),
}
}
????????當使用match表達式處理枚舉時,我們可以直接匹配特定的變體。
????????在下面的示例代碼中,match表達式中有三個模式:
????????Color::Red:匹配Color枚舉的Red變體。如果color是Red,將執(zhí)行此模式對應(yīng)的代碼塊,并打印"Color is red"。
????????Color::Green:匹配Color枚舉的Green變體。如果color是Green,將執(zhí)行此模式對應(yīng)的代碼塊,并打印"Color is green"。
????????Color::Blue(r, g, b):匹配Color枚舉的Blue變體,并解構(gòu)出其關(guān)聯(lián)的值,將RGB三個分量的值分別綁定到變量r、g和b上。如果color是Blue,將執(zhí)行此模式對應(yīng)的代碼塊,并使用println!宏打印出"Color is blue: (r, g, b)",其中r、g和b是具體的RGB值。
????????因為color被初始化為Color::Blue(0, 255, 0),所以match表達式將匹配Color::Blue(r, g, b)模式,并執(zhí)行相應(yīng)的代碼塊。
enum Color {
Red,
Green,
Blue(u8, u8, u8),
}
fn main() {
let color = Color::Blue(0, 255, 0);
match color {
Color::Red => println!("Color is red"),
Color::Green => println!("Color is green"),
Color::Blue(r, g, b) => println!("Color is blue: ({}, {}, {})", r, g, b),
}
}
_通配符和..剩余模式
????????_作為通配符匹配任何值,而..則是剩余模式,用來捕獲列表、數(shù)組或結(jié)構(gòu)體中未顯式匹配的部分。
????????在下面的示例代碼中,match表達式中有兩個模式:
????????[first, second, ..]:這是一個解構(gòu)模式,用于匹配數(shù)組或切片。這個模式將數(shù)組的第一個元素綁定到變量first,第二個元素綁定到變量second,而..表示匹配并忽略剩余的所有元素。
????????_:這是一個通配符模式,用于匹配任何未被之前模式匹配的值。如果數(shù)組numbers與前面的模式不匹配,就會執(zhí)行這個模式對應(yīng)的代碼塊。
????????因為numbers數(shù)組至少有兩個元素,所以它會成功匹配[first, second, ..]模式。因此,first會被綁定到10,second會被綁定到20,然后執(zhí)行該模式對應(yīng)的代碼塊。如果numbers數(shù)組的元素少于兩個,那么[first, second, ..]模式就不會匹配,而是會執(zhí)行_模式對應(yīng)的代碼塊。
fn main() {
let numbers = [10, 20, 30, 40, 50];
match numbers {
[first, second, ..] => println!("{}, {}", first, second),
_ => println!("other conditions"),
}
}
模式守衛(wèi)
????????除了以上的模式匹配,Rust還提供了模式守衛(wèi)等高級功能。模式守衛(wèi)允許我們在匹配模式時附加一個條件,只有當條件為真時,模式才匹配成功。模式守衛(wèi)寫在match分支的模式后面,使用if關(guān)鍵字開頭,后面跟著一個布爾表達式。
????????在下面的示例代碼中,我們匹配一個元組pair。對于每個模式,我們有一個條件表達式,它必須為true才能使相應(yīng)的分支被執(zhí)行。第一個分支檢查x和y是否都大于0,第二個分支檢查x是否大于0。如果兩個條件都不滿足,則執(zhí)行最后一個分支。文章來源:http://www.zghlxwxcb.cn/news/detail-849038.html
fn main() {
let pair = (66, -99);
match pair {
(x, y) if x > 0 && y > 0 => println!("both are positive: {} and {}", x, y),
(x, y) if x > 0 => println!("only x is positive: {}", x),
_ => println!("neither is positive"),
}
}
總結(jié)
????????Rust中的模式匹配功能強大且靈活,它極大地提高了代碼的表達力和可讀性,讓開發(fā)者能夠優(yōu)雅地處理各種復(fù)雜的數(shù)據(jù)結(jié)構(gòu)和條件分支。通過熟練掌握模式匹配,我們可以編寫出更為簡潔、高效和安全的Rust代碼。文章來源地址http://www.zghlxwxcb.cn/news/detail-849038.html
到了這里,關(guān)于30天拿下Rust之模式與模式匹配的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!