【一起学Rust | 基础篇 | rust新特性】Rust 1.65.0——泛型关联类型、let-else语句

简介: 【一起学Rust | 基础篇 | rust新特性】Rust 1.65.0——泛型关联类型、let-else语句



前言

本系列文章为介绍Rust更新的各版本特性。从当前版本开始往后更新。

本期内容是Rust 1.65.0的新版本特新,包括

  • 泛型关联类型
  • let-else语句
  • break标记语法

等内容,当然本次更新还有一个特性,就是差分Linux调试信息,由于我目前还是在Windows环境下进行编程,就不写这部分内容了,如果你感兴趣,可以去更新文档研究研究。

更新Rust

如果你还没有更新rust,那么就运行以下命令来更新你的rust。

rustup update stable

如果你的版本是nightly,那么请运行以下命令进行更新

rustup default nightly

如果你的版本是beta版本,请运行以下命令进行更新

rustup default beta

高于此版本不用更新


一、泛型关联类型

现在可以在关联类型上定义生存期、类型和常量泛型,如下所示:

trait Foo {
    type Bar<'x>;
}

类似生成器的trait,可以从Self借用泛型关联类型

trait LendingIterator {
    type Item<'a> where Self: 'a;
    fn next<'a>(&'a mut self) -> Option<Self::Item<'a>>;
}

可以在智能指针(如“Rc”或“Arc”)上实现,以便允许在指针类型上使用泛型

trait PointerFamily {
    type Pointer<T>: Deref<Target = T>;
    fn new<T>(value: T) -> Self::Pointer<T>;
}

允许借用数组。对于类似“NdArray”的类型非常有用,这些类型不必连续存储数据。

trait BorrowArray<T> {
    type Array<'x, const N: usize> where Self: 'x;
    fn borrow_array<'a, const N: usize>(&'a self) -> Self::Array<'a, N>;
}

二、let-else语句

let-else语法格式

let PATTERN: TYPE = EXPRESSION else {
    DIVERGING_CODE;
};

note:

PATTERN:变量名

TYPE :类型

EXPRESSION :表达式

DIVERGING_CODE:代码

正常的语句只能使用静态的、已知的模式来匹配返回的结构、元组等,现在可以在模式不匹配时进行处理

fn get_count_item(s: &str) -> (u64, &str) {
    let mut it = s.split(' ');
    let (Some(count_str), Some(item)) = (it.next(), it.next()) else {
        panic!("Can't segment count item pair: '{s}'");
    };
    let Ok(count) = u64::from_str(count_str) else {
        panic!("Can't parse integer: '{count_str}'");
    };
    (count, item)
}
assert_eq!(get_count_item("3 chairs"), (3, "chairs"));

名称绑定的范围是区别于match或if-let-else表达式的主要原因

let (count_str, item) = match (it.next(), it.next()) {
        (Some(count_str), Some(item)) => (count_str, item),
        _ => panic!("Can't segment count item pair: '{s}'"),
    };
    let count = if let Ok(count) = u64::from_str(count_str) {
        count
    } else {
        panic!("Can't parse integer: '{count_str}'");
    };

三、break标记语法

在很多常规代码中,你可能见过使用了一个循环,仅仅是为了获取一个标记,这就使得代码变得很复杂。Rust专门针对这个问题退出了一个语言功能,标记也可以包含一个表达式值,就像循环一样,让多语句块可以提前返回值。

let result = 'block: {
    do_thing();
    if condition_not_met() {
        break 'block 1;
    }
    do_next_thing();
    if condition_not_met() {
        break 'block 2;
    }
    do_last_thing();
    3
};

在之前的Rust中,是支持break指定标记的,用来消除循环中的歧义,如下所示

fn main() {
    let mut count = 0;
    'counting_up: loop {
        println!("count = {count}");
        let mut remaining = 10;
        loop {
            println!("remaining = {remaining}");
            if remaining == 9 {
                break;
            }
            if count == 2 {
                break 'counting_up;
            }
            remaining -= 1;
        }
        count += 1;
    }
    println!("End count = {count}");
}

通过有标记的break可以很轻松的消除break在代码中的歧义,否则break的时候就要靠程序员的经验了。


总结

以上内容就是Rust 1.65.0更新的主要内容了,很明显我也是一知半解,所以在这里占个坑,这些知识在用的时候才会起到作用。

目录
相关文章
|
6月前
|
Rust 区块链
学Rust不学Cargo,等于没学Rust:features特性详解
在 Rust 中,Cargo 的 "features" 是一种条件编译机制,允许在编译 crate 时编译部分代码。这样可以在一个 crate 中提供多个功能,并根据需要选择性地启用或禁用这些功能。
201 1
|
6月前
|
设计模式 Rust JavaScript
【一起学Rust | 设计模式】习惯语法——使用借用类型作为参数、格式化拼接字符串、构造函数
【一起学Rust | 设计模式】习惯语法——使用借用类型作为参数、格式化拼接字符串、构造函数
87 0
|
19天前
|
Rust 安全 Java
编程语言新宠:Rust语言的特性、优势与实战入门
【10月更文挑战第27天】Rust语言以其独特的特性和优势在编程领域迅速崛起。本文介绍Rust的核心特性,如所有权系统和强大的并发处理能力,以及其性能和安全性优势。通过实战示例,如“Hello, World!”和线程编程,帮助读者快速入门Rust。
37 1
|
20天前
|
Rust 安全 编译器
编程语言新宠:Rust语言的特性、优势与实战入门
【10月更文挑战第26天】Rust语言诞生于2006年,由Mozilla公司的Graydon Hoare发起。作为一门系统编程语言,Rust专注于安全和高性能。通过所有权系统和生命周期管理,Rust在编译期就能消除内存泄漏等问题,适用于操作系统、嵌入式系统等高可靠性场景。
31 2
|
2月前
|
设计模式 Rust 安全
30天拿下Rust之高级类型
30天拿下Rust之高级类型
23 0
|
2月前
|
Rust 编译器 容器
30天拿下Rust之泛型
30天拿下Rust之泛型
25 0
|
3月前
|
Rust JavaScript 前端开发
Rust! 无VDom! 尤雨溪解析 Vue.js 2024 新特性
Rust! 无VDom! 尤雨溪解析 Vue.js 2024 新特性
|
3月前
|
Rust 安全 Java
神秘编程世界惊现独特规则,Rust 核心特性究竟隐藏着怎样的秘密?快来一探究竟!
【8月更文挑战第31天】在编程领域,Rust 以所有权、借用和生命周期等核心特性著称,提供强大的内存安全保障。所有权确保每个值有唯一所有者并自动管理内存,避免手动管理内存带来的问题。借用则允许临时访问值而不转移所有权,确保内存安全访问。生命周期机制在编译时保证引用的有效性,无需运行时检查。通过对比 Rust 与 C/C++ 的示例,可以更清晰地理解这些特性带来的优势。
30 1
|
4月前
|
Rust 安全 程序员
Rust与C++的区别及使用问题之Rust解决多线程下的共享的问题如何解决
Rust与C++的区别及使用问题之Rust解决多线程下的共享的问题如何解决
|
5月前
|
Rust 安全 开发者
探索Rust语言的内存安全特性
【6月更文挑战第8天】Rust语言针对内存安全问题提供了创新解决方案,包括所有权系统、借用规则和生命周期参数。所有权系统确保值与其所有者绑定,防止内存泄漏;借用规则保证同一时间只有一个可变引用或多个不可变引用,消除数据竞争和野指针;生命周期参数则强化了引用的有效范围,提升安全性。通过这些特性,Rust帮助开发者编写出更健壮、安全的高性能软件,有望成为系统编程领域的领头羊。
下一篇
无影云桌面