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

这篇具有很好参考价值的文章主要介绍了30天拿下Rust之超级好用的“语法糖”。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

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

1、字符串插值

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

fn main() {
    let name = "CSDN";
    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的类型,从而访问其内部的值。这是一种隐式的类型转换,使得代码更加简洁。文章来源地址https://www.toymoban.com/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转换,可以直接解引用MyBox实例,从而访问其内部的value字段
    println!("{}", *my_box);
}

到了这里,关于30天拿下Rust之超级好用的“语法糖”的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 30天拿下Rust之Trait

    概述         在Rust中,Trait是一个核心概念,它允许我们定义类型应该具有的行为。Trait类似于其他语言中的接口,但Rust的Trait更为强大和灵活。它不仅定义了一组方法,还允许我们指定方法的默认实现、泛型约束和继承。通过Trait,我们可以定义一组方法的签名和关联类

    2024年03月17日
    浏览(30)
  • 30天拿下Rust之错误处理

    概述         在软件开发领域,对错误的妥善处理是保证程序稳定性和健壮性的重要环节。Rust作为一种系统级编程语言,以其对内存安全和所有权的独特设计而著称,其错误处理机制同样体现了Rust的严谨与实用。在Rust中,错误处理通常分为两大类:不可恢复的错误和可

    2024年03月21日
    浏览(57)
  • 30天拿下Rust之高级类型

    概述         Rust作为一门系统编程语言,以其独特的内存管理方式和强大的类型系统著称。其中,高级类型的应用,为Rust的开发者提供了丰富的编程工具和手段,使得开发者可以更加灵活和高效地进行编程。 Newtype模式         Newtype模式是一种轻量级的设计模式,用

    2024年04月15日
    浏览(34)
  • 30天拿下Rust之HashMap

    概述         HashMap,被称为哈希表或散列表,是一种可以存储键值对的数据结构。它使用哈希函数将键映射到存储位置,以便可以快速检索和更新元素。这种数据结构在许多编程语言中都存在,而在Rust中,它被实现为HashMapK, V。其中,K表示键的类型,V表示值的类型。H

    2024年03月17日
    浏览(33)
  • 30天拿下Rust之生命周期

    概述         在Rust中,生命周期是一个非常重要的概念,是保证内存安全和防止悬垂引用的核心机制之一。通过精确地跟踪引用的生命周期,Rust能够在编译阶段就防止许多其他语言在运行时才会遇到的内存问题。在Rust中,生命周期代表了引用的有效时间段。当我们创建

    2024年03月20日
    浏览(35)
  • 30天拿下Rust之图形编程

    概述         Rust语言以其卓越的安全性、性能和可靠性赢得了广大开发者的青睐,逐渐在系统编程、网络服务、游戏开发等领域崭露头角。随着Rust生态的日益繁荣,图形编程领域也涌现出一批优秀的框架和库,使得用Rust进行高效、安全的图形应用开发成为可能。 图形库

    2024年04月17日
    浏览(26)
  • 30天拿下Rust之面向对象

    概述         在编程语言的世界中,Rust以其独特的内存安全、并发控制和高性能特性吸引了众多开发者。虽然Rust并非传统的面向对象编程语言(比如:C++、Java),但它依然支持并提供了一种颇具特色的面向对象编程方式,以实现类似于面向对象的编程范式。        

    2024年04月15日
    浏览(28)
  • 30天拿下Rust之unsafe代码

    概述         在Rust语言的设计哲学中,\\\"安全优先\\\" 是其核心原则之一。然而,在追求极致性能或者与底层硬件进行交互等特定场景下,Rust提供了unsafe。unsafe代码允许开发者暂时脱离Rust的安全限制,直接操作内存和执行低级操作。虽然unsafe代码在某些情况下是必要

    2024年04月17日
    浏览(34)
  • 30天拿下Rust之网络编程

    概述         在现代软件开发中,网络编程无处不在。无论是构建高性能的服务器、实时通信应用,还是实现复杂的分布式系统,对网络编程技术的掌握都至关重要。Rust语言以其卓越的安全性、高性能和优秀的并发模型,为网络编程提供了坚实的基础。 std::net       

    2024年04月14日
    浏览(28)
  • 30天拿下Rust之字符串

    概述         在Rust中,字符串是一种非常重要的数据类型,用于处理文本数据。Rust的字符串是以UTF-8编码的字节序列,主要有两种类型:str和String。其中,str是一个对字符数据的不可变引用,更像是对现有字符串数据的“视图”,而String则是一个独立、可变更的字符串实

    2024年03月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包