概述
????????Rust語言的設(shè)計非常注重開發(fā)者的體驗,因此它包含了許多實用的“語法糖”。這些“語法糖”讓代碼更簡潔、易讀,同時保持了語言的強大和靈活性。
1、字符串插值
????????字符串插值允許我們在字符串中嵌入變量或表達式的值,使用{}作為占位符。
fn main() {
let name = "CSDN";
let text = format!("Hello {}", name);
println!("{}", text);
}
2、if-let表達式
????????if let是if和let的結(jié)合,用于在if條件中同時進行模式匹配和解構(gòu)賦值。
fn main() {
let x = Some(66);
if let Some(value) = x {
println!("value is: {}", value);
} else {
println!("value is None");
}
}
3、Range表達式
????????..是不包含結(jié)束值的范圍操作符,..=是包含結(jié)束值的范圍操作符。
fn main() {
for i in 1..=5 {
println!("{}", i);
}
for i in 1..5 {
println!("{}", i);
}
}
4、閉包
????????閉包是匿名的函數(shù),它們可以捕獲其創(chuàng)建環(huán)境的變量。在下面的示例代碼中,閉包被用來過濾偶數(shù)。
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
let even_numbers = numbers.iter().filter(|&x| x % 2 == 0).collect::<Vec<_>>();
println!("{:?}", even_numbers);
}
5、推導(dǎo)式
????????通過#[derive(...)]屬性,Rust可以自動為結(jié)構(gòu)體或枚舉生成標(biāo)準(zhǔn)的方法實現(xiàn),比如:Debug、Eq、PartialEq等。在下面的示例代碼中,我們?yōu)镻erson結(jié)構(gòu)體類型使用了#[derive(Debug)]屬性,因此編譯器為我們自動生成了Debug Trait的實現(xiàn)。在main函數(shù)中,我們使用{:?}格式化占位符來打印person變量的調(diào)試信息。
#[derive(Debug)]
struct Person {
name: String,
age: u8,
}
fn main() {
let person = Person {
name: "Mike".to_string(),
age: 24,
};
// 輸出:Person { name: "Mike", age: 24 }
println!("{:?}", person);
}
6、使用結(jié)構(gòu)體更新語法
????????結(jié)構(gòu)體更新語法允許我們在創(chuàng)建或修改結(jié)構(gòu)體實例時,僅指定需要更改的字段,而其余字段則保持其默認值或現(xiàn)有值不變。這種語法特別適用于當(dāng)結(jié)構(gòu)體有很多字段,而只想改變其中一個或幾個字段時。
#[derive(Debug)]
struct Person {
name: String,
age: u8,
city: String,
}
fn main() {
let mut person = Person {
name: "Mike".to_string(),
age: 24,
city: "London".to_string(),
};
// 除name字段外,其余字段保持不變
person = Person {
name: "Bob".to_string(),
..person
};
// 輸出: Person { name: "Bob", age: 24, city: "London" }
println!("{:?}", person);
}
7、使用_忽略不關(guān)心的值
????????在解構(gòu)賦值時,可以使用_來忽略我們不關(guān)心的值。
fn main() {
let (_, b) = (66, 99);
// 輸出:99
println!("{}", b);
}
8、使用?在表達式中處理Result
?????????操作符可以在Result類型的表達式中用來自動處理錯誤。如果Result是Err,則整個表達式立即返回錯誤。如果是Ok,則繼續(xù)執(zhí)行。
use std::fs::File;
use std::io::Read;
fn read_file(path: &str) -> Result<String, std::io::Error> {
let mut file = File::open(path)?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
Ok(contents)
}
fn main() {
match read_file("example.txt") {
Ok(contents) => println!("file contents: {}", contents),
Err(error) => eprintln!("read file failed: {}", error),
}
}
9、使用break 'label在嵌套循環(huán)中提前退出
????????通過在循環(huán)前使用標(biāo)簽(比如:下面的'outer:和'inner:),可以在嵌套循環(huán)中使用break 'label來提前退出指定標(biāo)簽的循環(huán)。文章來源:http://www.zghlxwxcb.cn/news/detail-852946.html
fn main() {
'outer: for i in 0..5 {
'inner: for j in 0..5 {
if i == 2 && j == 2 {
// 跳出外層循環(huán)
break 'outer;
}
println!("({}, {})", i, j);
}
}
}
10、Deref轉(zhuǎn)換
????????Deref轉(zhuǎn)換允許通過*操作符自動解引用實現(xiàn)了Deref Trait的類型,從而訪問其內(nèi)部的值。這是一種隱式的類型轉(zhuǎn)換,使得代碼更加簡潔。文章來源地址http://www.zghlxwxcb.cn/news/detail-852946.html
use std::ops::Deref;
struct CustomBox<T> {
value: T,
}
impl<T> Deref for CustomBox<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.value
}
}
fn main() {
let my_box = CustomBox { value: 66 };
// 通過Deref轉(zhuǎn)換,可以直接解引用MyBox實例,從而訪問其內(nèi)部的value字段
println!("{}", *my_box);
}
到了這里,關(guān)于30天拿下Rust之超級好用的“語法糖”的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!