Rust也出2077? 最受欢迎的编程语言再度更新!(下)

简介: 最受欢迎的编程语言Rust,在官方博客中更新了2021 edition的计划,该计划将于10月发布,其中新的功能备受网友们的期待。

15.jpg

2021更新计划中都有什么?

 

1. Edition 是什么? Rust提出了一种Edition更新形式,这种方式不会割裂生态系统。 一个向后不兼容的功能将会被作为新的Rust Edition的一部分。Edition是选择性加入的,因此,除非现有的crate明确迁移到新版本中,否则就不会看到这些变化。 一个Edition中的crate可以与其他Edition中编译的crate无缝地互操作。不管Edition如何,所有 Rust代码最终都会在编译器中编译为相同的内部 IR。
Edition的迁移也几乎是全自动的。在发布新Edition的同时,会附带一个自动迁移工具。除此以外,还有一本《版本迁移指南》,该指南既是版本的概述,也是在遇到问题的故障排除参考。 在对旧的版本进行迁移时,需要对代码进行一些小的更改。例如,当迁移到Rust 2018时,所有的「async」都会变为:「r#async」。 2. prelude中新的内容 Rust编译器会优先处理手动导入的项,使得在prelude添加的内容不会破坏任何现有代码。 例如,一个名为「example」的crate或module,其中包含「pub struct Option ;」,那么可以通过使用「example::*;」,使得「Option」明确引用「example;」而不是标准库中的。 但是,在prelude中添加特征便可能会破坏现有代码。例如,在使用「MyTryInto」特征调用「x.try_into()」时,如果还导入了「std」的「TryInto」,则会出现无法编译的情况,因为它提供了具有相同名称的方法。 作为解决方案,Rust 2021将使用新的prelude,其中增加了三个新的功能:

16.png

3. 默认使用Cargo功能解析器 自1.51.0起,Cargo在选择加入中有了对新的功能解析器的支持,该功能可以在「Cargo.toml」中使用「resolver = "2"」激活。 从Rust 2021开始,这将是默认设置。也就是说,在「Cargo.toml」中写入「edition = "2021"」就意味着「resolver = "2"」。 4. 数组迭代器IntoIterator 在Rust 1.53.0之前,「IntoIterator」只能用于数组的引用。也就是说可以遍历「&[1, 2, 3]」和「&mut [1, 2, 3]」,但不能直接遍历「[1, 2, 3]」。

17.png

团队在1.53.0之后所有版本中添加特征实现。在Rust 2015和2018代码中,编译器仍会将「 array.into_iter()」解析为「(&array).into_iter()」。 这仅适用于「.into_iter()」调用语法, 而不会影响任何其他语法,例如「for e in [1, 2, 3]」,「iter.zip([1, 2, 3])」或「IntoIterator::into_iter([1, 2, 3])」。 5. 闭包(closures)的捕获 闭包会自动从代码块中捕获所有的引用。例如,「|| a. + 1」会自动从周围的上下文中捕获对「a」的引用,不仅仅是「a.x」。这会在某些情形下造成问题。

18.png当结构的某个字段被借用或移出时,其他字段将无法再用于闭包中,因为整个结构都会因为被捕获而变得不再可用。 从Rust 2021开始,闭包将仅捕获其使用的字段。 由于这个变化会对字段的删除顺序造成影响,目前仅在新版本中被激活。如果像以前一样捕获整个结构,则可通过在闭包中插入「let _ = &a; 」得到。对于其他版本,可以使用自动迁移,从而更新相关的闭包。  6. Panic宏的一致性 「panic!()」宏仅在使用多个参数调用时才使用字符串格式。当使用单个参数调用时,它甚至不会查看该参数。


19.png

一旦隐式格式参数被确定,就会出现问题了。此时「println!("hello {name}")」会变成「println!("hello {}", name)」的简写形式。但是「panic!("hello {name}")」无法执行,因为「panic!()」不会将单个参数作为格式化字符串处理。 为了避免这种情况,Rust 2021提供了更具一致性的「panic!()」宏。新的「panic!()」宏将不再接受任意表达式作为唯一参数。而是像「println!()」一样,始终将第一个参数作为格式化字符串处理。 由此「panic_any()」便成为了对格式化字符串以外的其他内容进行「panic」的唯一方法。 另外,Rust 2021中的「core::panic!()」和「std::panic!()」将会是等效的。目前,这两者之间存在一些差异,尤其是在开启或关闭「#![no_std]」时 。 7.保留的语法 为了将来为某些新语法腾出空间,我们决定为前缀的标识符和文字保留语法:「prefix#identifier」,「prefix"string"」,「prefix'c'」和「prefix#123」,其中「prefix」可以是任何标识符(除了那些已经具有含义的,例如「b'…'」和「r"…"」)。 这是一个重大变化,因为宏会接受「hello"world"」,并视其为两个单独的标记:「hello」和「"world"」。解决方法很简单,只需插入一个空格:「hello "world"」 这些是可能会看到的一些新前缀: 「f""」是格式字符串的简写形式。例如,「f"hello {name}"」是等效的「format_args!()」调用的简写形式。 「c""」或「z""」用于空终止的C字符串。 「k#keyword」允许编写当前版本中尚不存在的关键字。例如,虽然「async」在2015版中不是关键字,但是该前缀将允许在2015版中以「k#async」作为替代。 8. 新的硬错误 在Rust 2021中,现有的两个lint会被视为硬错误,在旧版本中,这些lint将仍然是警告。 「bare-trait-objects」:在Rust 2021中,必须使用「dyn」关键字标识特征对象。 「ellipsis-inclusive-range-patterns」:Rust 2021不再接受过时的「...」语法,取而代之的是「.. =」,不过表达式的使用是一样的。 9. 「micro_rules」中的or 从1.53.0开始,便加入了对「|」的支持,使其可以嵌套在任何地方。例如,现在可以写「Some(1 | 2)」,而不需要使用「Some(1) | Some(2)」这种方式。 这个改动会对「macro_rules」宏产生影响,于是在1.53.0中「:pat」并不与「|」相匹配。因为之前,并非在所有嵌套级别都可以包含「|」。 不过,在Rust 2021中,「:pat」片段说明符将匹配「A | B」。 由于有时仍然希望匹配不带「|」的单个模式变量,因此添加了指定的片段「:pat_param」以保留旧的行为。

 

相关文章
|
2月前
|
Rust 安全 Java
编程语言新宠:Rust语言的特性、优势与实战入门
【10月更文挑战第27天】Rust语言以其独特的特性和优势在编程领域迅速崛起。本文介绍Rust的核心特性,如所有权系统和强大的并发处理能力,以及其性能和安全性优势。通过实战示例,如“Hello, World!”和线程编程,帮助读者快速入门Rust。
90 1
|
2月前
|
Rust 安全 编译器
编程语言新宠:Rust语言的特性、优势与实战入门
【10月更文挑战第26天】Rust语言诞生于2006年,由Mozilla公司的Graydon Hoare发起。作为一门系统编程语言,Rust专注于安全和高性能。通过所有权系统和生命周期管理,Rust在编译期就能消除内存泄漏等问题,适用于操作系统、嵌入式系统等高可靠性场景。
116 2
|
3月前
|
Rust 安全 开发工具
探索 Rust:系统编程语言的新纪元
【10月更文挑战第17天】介绍了 Rust 语言的核心特性,如内存安全、强大的并发编程模型和接近 C/C++ 的性能。文章还涵盖了 Rust 的开发工具,如 Cargo 和 Rustup,以及其在业界的应用,包括微软 Azure 和 Firefox 浏览器。Rust 正在成为系统编程领域的新星,为开发者带来高性能和安全性。
|
3月前
|
Rust 安全 Java
软件工程师,是时候了解下Rust编程语言了
2024年年初,美国政府发布了一份网络安全报告,呼吁软件开发人员停止使用容易出现内存安全漏洞的编程语言,比如:C和C++,转而使用内存安全的编程语言。这份报告由美国网络空间总监办公室 (ONCD) 发布,旨在落实美国总统拜登的网络安全战略,目标是“保护网络空间的基石”。 内存安全指的是程序在访问内存时,能够避免出现错误和漏洞,比如:缓冲区溢出、野指针等。Java由于其运行时错误检测机制,被认为是一种内存安全的语言。然而,C和C++允许直接操作内存地址,并且缺乏边界检查,容易出现内存安全问题。
86 10
|
4月前
|
Rust 安全 Java
探索 Rust:系统编程语言的新纪元
Rust 是一种由 Mozilla 研究院开发的开源系统编程语言,以其内存安全、高性能和现代并发工具著称,已连续多年被评为 Stack Overflow 最受喜爱的编程语言。Rust 通过所有权系统和借用检查等机制确保内存安全,并具备无垃圾回收、强大类型系统及高效并发编程特性。它广泛应用于系统级应用、WebAssembly、区块链技术和游戏开发等领域。Rust 提供丰富的学习资源和开发工具,包括官方文档、书籍、Cargo 包管理器和活跃社区支持,正逐渐成为系统编程领域的新力量。
|
5月前
|
Rust 安全 编译器
编程语言的演变:从C到Rust的技术探索
【8月更文挑战第14天】从C语言到Rust语言的演变是编程语言发展历程中的一个重要篇章。这一演变不仅体现了编程语言的不断进步和发展,也为我们展示了编程语言的无限可能性和广阔前景。
|
5月前
|
机器学习/深度学习 Rust 编译器
神秘编程语言 Rust 背后究竟隐藏着怎样的生态宝藏?框架、工具链与社区资源大揭秘!
【8月更文挑战第31天】Rust 语言凭借卓越性能与内存安全性吸引了众多开发者。其生态系统包括多种框架(如 Actix-web、Rocket 和 Warp)、强大的工具链(如包管理器 Cargo 和高效编译器)以及丰富的社区资源。Cargo 简化了项目管理,编译器提供详尽错误信息并支持增量编译,而活跃的社区则为学习与交流提供了广阔平台,涵盖官方文档、博客、论坛及大量 GitHub 开源项目。随着更多开发者的加入,Rust 生态系统将持续繁荣发展。
100 0
|
6月前
|
JavaScript Java 开发者
Rust 问题之在众多编程语言中关于内存管理有哪些分类
Rust 问题之在众多编程语言中关于内存管理有哪些分类
|
7月前
|
Rust 安全 Linux
RUST 编程语言使构建更安全的软件变得更加容易。RUST ALL THE THINGS 需要什么?
RUST 编程语言使构建更安全的软件变得更加容易。RUST ALL THE THINGS 需要什么?
45 2
|
8月前
|
Rust 安全 Java
Rust 和 Go:如何选择最适合你的编程语言
Rust 和 Go 都是优秀的选择 首先,重要的是要说 Rust 和 Go 都是非常优秀的编程语言。它们都是现代的、强大的,被广泛采用,且提供了卓越的性能。
84 1