写点什么

30 天拿下 Rust 之超级好用的“语法糖”

作者:希望睿智
  • 2024-07-10
    安徽
  • 本文字数:1937 字

    阅读完需:约 6 分钟

30天拿下Rust之超级好用的“语法糖”

概述

Rust 语言的设计非常注重开发者的体验,因此它包含了许多实用的“语法糖”。这些“语法糖”让代码更简洁、易读,同时保持了语言的强大和灵活性。

1、字符串插值

字符串插值允许我们在字符串中嵌入变量或表达式的值,使用{}作为占位符。

fn main() {    let name = "World";    let text = format!("Hello {}", name);    println!("{}", text);}
复制代码

2、if-let 表达式

if let 是 if 和 let 的结合,用于在 if 条件中同时进行模式匹配和解构赋值。

fn main() {    let x = Some(66);    if let Some(value) = x {            println!("value is: {}", value);    } else {            println!("value is None");    }}
复制代码

3、Range 表达式

..是不包含结束值的范围操作符,..=是包含结束值的范围操作符。

fn main() {    for i in 1..=5 {        println!("{}", i);    }
for i in 1..5 { println!("{}", i); }}
复制代码

4、闭包

闭包是匿名的函数,它们可以捕获其创建环境的变量。在下面的示例代码中,闭包被用来过滤偶数。

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、推导式

通过 #[derive(...)]属性,Rust 可以自动为结构体或枚举生成标准的方法实现,比如:Debug、Eq、PartialEq 等。在下面的示例代码中,我们为 Person 结构体类型使用了 #[derive(Debug)]属性,因此编译器为我们自动生成了 Debug Trait 的实现。在 main 函数中,我们使用{:?}格式化占位符来打印 person 变量的调试信息。

#[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、使用结构体更新语法

结构体更新语法允许我们在创建或修改结构体实例时,仅指定需要更改的字段,而其余字段则保持其默认值或现有值不变。这种语法特别适用于当结构体有很多字段,而只想改变其中一个或几个字段时。

#[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、使用_忽略不关心的值

在解构赋值时,可以使用_来忽略我们不关心的值。

fn main() {    let (_, b) = (66, 99);    // 输出:99    println!("{}", b);}
复制代码

8、使用?在表达式中处理 Result

?操作符可以在 Result 类型的表达式中用来自动处理错误。如果 Result 是 Err,则整个表达式立即返回错误。如果是 Ok,则继续执行。

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 在嵌套循环中提前退出

通过在循环前使用标签(比如:下面的'outer:和'inner:),可以在嵌套循环中使用 break 'label 来提前退出指定标签的循环。

fn main() {    'outer: for i in 0..5 {        'inner: for j in 0..5 {            if i == 2 && j == 2 {                // 跳出外层循环                break 'outer;            }                        println!("({}, {})", i, j);        }    }}
复制代码

10、Deref 转换

Deref 转换允许通过*操作符自动解引用实现了 Deref Trait 的类型,从而访问其内部的值。这是一种隐式的类型转换,使得代码更加简洁。

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转换,可以直接解引用MyBox实例,从而访问其内部的value字段 println!("{}", *my_box);}
复制代码


💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。

发布于: 刚刚阅读数: 5
用户头像

希望睿智

关注

一起学习,一起成长,一起进步! 2024-05-21 加入

中国科学技术大学毕业,在客户端、运营级平台、Web开发、嵌入式开发、深度学习、人工智能、音视频编解码、图像处理、流媒体等多个领域具备实战开发经验和技术积累,共发表发明专利十余项,软件著作权几十项。

评论

发布
暂无评论
30天拿下Rust之超级好用的“语法糖”_语法糖_希望睿智_InfoQ写作社区