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

简介: 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);
}


相关文章
|
2月前
|
Rust 安全 Java
30天拿下Rust之面向对象
30天拿下Rust之面向对象
33 0
|
2月前
|
Rust 编译器 容器
30天拿下Rust之泛型
30天拿下Rust之泛型
24 0
|
2月前
|
存储 Rust
30天拿下Rust之Trait
30天拿下Rust之Trait
35 0
|
2月前
|
Rust 安全
30天拿下Rust之错误处理
30天拿下Rust之错误处理
30 0
|
2月前
|
Rust 安全 前端开发
30天拿下Rust之图形编程
30天拿下Rust之图形编程
34 0
|
3月前
|
存储 Rust 编译器
30天拿下Rust之函数详解
在Rust中,函数是程序的基本构建块,是代码复用的基本单位,用于封装一系列执行特定操作和计算的语句。函数是可重用的代码片段,可以接受输入参数并产生输出。通过合理使用函数,可以提高代码的可读性、可维护性和可重用性。
44 4
|
3月前
|
Rust 安全 物联网
30天拿下Rust之前世今生
Rust 是一种关注安全与效能的系统级编程语言,由 Mozilla 研究员 Graydon Hoare 于 2006 年发起,旨在解决 C++ 的内存安全与并发难题。通过独特的所有权模型和借用检查机制,Rust 消除了传统语言中的许多安全隐患,实现了内存安全且无运行时垃圾回收。Rust 在 2015 年发布 1.0 版本后迅速崛起,被广泛应用于系统编程、网络服务、浏览器引擎乃至游戏开发等多个领域。其高效的性能、强大的类型系统及丰富的生态系统使其成为开发者心中的新宠。随着技术的进步,Rust 预计将在更多项目中获得应用,并逐渐成为主流选择,特别是在云服务、分布式系统和安全性要求极高的场景中。
49 5
|
3月前
|
Rust 安全 编译器
30天拿下Rust之语法大全
Rust是一种系统级编程语言,以其独特的所有权系统和内存安全性受到开发者青睐。本文从基本数据类型入手,介绍了标量类型如整数、浮点数、布尔值及字符,复合类型如元组、数组和结构体等。此外,还探讨了变量与常量的声明与使用,条件判断与循环语句的语法,以及函数定义与调用的方法。文章通过示例代码展示了如何使用Rust编写简洁高效的程序,并简要介绍了注释与宏的概念,为读者快速掌握这门语言提供了实用指南。欲获取最新文章或交流技术问题,请关注微信公众号“希望睿智”。
43 1
|
2月前
|
存储 Rust 安全
30天拿下Rust之引用
在Rust语言中,引用机制是其所有权系统的重要组成部分,它为开发者提供了一种既高效又安全的方式来访问和共享数据。引用可以被视为一个指向内存地址的指针,它允许我们间接地访问和操作存储在内存中的数据。与其他语言中的指针不同,Rust中的引用是类型安全的,并且会在编译时进行严格检查,以确保不会出现悬挂引用或野指针。Rust提供了两种类型的引用:不可变引用(&)和可变引用(&mut)。
21 0
|
2月前
|
存储 Rust 安全
30天拿下Rust之字符串
在Rust中,字符串是一种非常重要的数据类型,用于处理文本数据。Rust的字符串是以UTF-8编码的字节序列,主要有两种类型:&str和String。其中,&str是一个对字符数据的不可变引用,更像是对现有字符串数据的“视图”,而String则是一个独立、可变更的字符串实体。
42 0