Rust 团队很高兴宣布 Rust 的新版本 1.39.0。Rust 是一种编程语言,它使每个人都能构建可靠高效的软件。
如果您之前通过 rustup 安装了 Rust,获取 Rust 1.39.0 就像
$ rustup update stable
如果您还没有,您可以从我们网站上的相应页面获取 rustup
,并查看 GitHub 上的1.39.0 的详细发布说明。
1.39.0 稳定版中的内容
Rust 1.39.0 的亮点包括 async
/.await
、match
保护中对按移动绑定进行的共享引用以及函数参数上的属性。此外,请参阅详细的发布说明以获取更多信息。
.await
结束了,async fn
来了
之前在 Rust 1.36.0 中,我们宣布了Future
特性。当时,我们注意到
通过这种稳定性,我们希望为重要的箱子、库和生态系统提供时间来为
async
/.await
做准备,我们将在未来告诉您更多关于它们的信息。
承诺就是承诺。因此,在 Rust 1.39.0 中,我们很高兴地宣布 async
/ .await
已稳定!具体来说,这意味着您可以定义 async
函数和块并 .await
它们。
async
函数(您可以通过编写 async fn
而不是 fn
来引入)除了在调用时返回 Future
之外什么也不做。此 Future
是一个挂起的计算,您可以通过 .await
它来驱动它完成。除了 async fn
之外,async { ... }
和 async move { ... }
块(充当闭包)可用于定义“异步字面量”。
有关 async
/ .await
发布的更多信息,请阅读Niko Matsakis 的博客文章。
match
保护中对按移动绑定进行的引用
在 Rust 中进行模式匹配时,变量(也称为“绑定”)可以通过以下方式绑定
-
按引用,无论是不可变的还是可变的。这可以通过显式方式实现,例如分别通过
ref my_var
或ref mut my_var
。不过,大多数情况下,绑定模式会自动推断。 -
按值 - 无论是按复制(当绑定变量的类型实现
Copy
时),还是按其他方式按移动。
以前,Rust 会禁止在 match
表达式的 if
保护中对按移动绑定进行共享引用。这意味着以下代码将被拒绝
fn main() {
let array: Box<[u8; 4]> = Box::new([1, 2, 3, 4]);
match array {
nums
// ---- `nums` is bound by move.
if nums.iter().sum::<u8>() == 10
// ^------ `.iter()` implicitly takes a reference to `nums`.
=> {
drop(nums);
// ----------- `nums` was bound by move and so we have ownership.
}
_ => unreachable!(),
}
}
使用 Rust 1.39.0,上面的代码片段现在被编译器接受了。我们希望这将为 match
表达式提供更流畅、更一致的体验。
函数参数上的属性
使用 Rust 1.39.0,现在允许在函数、闭包和函数指针的参数上使用属性。以前,您可能写过
#[cfg(windows)]
fn len(slice: &[u16]) -> usize {
slice.len()
}
#[cfg(not(windows))]
fn len(slice: &[u8]) -> usize {
slice.len()
}
...现在您可以更简洁地写成
fn len(
#[cfg(windows)] slice: &[u16], // This parameter is used on Windows.
#[cfg(not(windows))] slice: &[u8], // Elsewhere, this one is used.
) -> usize {
slice.len()
}
您可以在此位置使用的属性包括
-
条件编译:
cfg
和cfg_attr
-
控制 lint:
allow
、warn
、deny
和forbid
-
由应用于项目的程序化宏属性使用的辅助属性。
我们希望这将用于在整个生态系统中提供更易读、更符合人体工程学的基于宏的 DSL。
借用检查迁移警告在 Rust 2018 中是硬错误
在 1.36.0 版本中,我们宣布,NLL 在 Rust 2018 首次发布后已进入 Rust 20151.31。
如 1.36.0 版本中所述,旧的借用检查器存在一些错误,这些错误会导致内存不安全。这些错误由 NLL 借用检查器修复。由于这些修复破坏了一些稳定代码,我们决定通过检查旧的借用检查器是否接受程序以及 NLL 检查器是否拒绝程序来逐步引入错误。如果是,则错误将变为警告。
使用 Rust 1.39.0,这些警告现在在 Rust 2018 中是错误。在下一个版本 Rust 1.40.0 中,这也将适用于 Rust 2015,这将最终使我们能够删除旧的借用检查器,并保持编译器干净。
如果您受到影响,或者想了解更多信息,请阅读Niko Matsakis 的博客文章。
const fn
标准库中更多 使用 Rust 1.39.0,以下函数已成为 const fn
Vec::new
、String::new
和LinkedList::new
str::len
、[T]::len
和str::as_bytes
abs
、wrapping_abs
和overflowing_abs
标准库的添加
在 Rust 1.39.0 中,以下函数已稳定
其他更改
Rust 1.39.0 版本中还有其他更改:查看Rust、Cargo 和 Clippy 中的更改。
另请参阅兼容性说明,以检查您是否受到这些更改的影响。
1.39.0 的贡献者
许多人共同创建了 Rust 1.39.0。没有你们,我们无法做到。 谢谢!