宣布 Rust 1.22 (以及 1.22.1)

2017年11月22日 · Rust 核心团队

Rust 团队很高兴宣布 Rust 的两个新版本,1.22.0 和 1.22.1。Rust 是一种系统编程语言,专注于安全性、速度和并发性。

等等,两个版本?在最后一刻,我们在 1.22.0 中发现了与新版 macOS High Sierra 有关的晚期问题,出于各种原因,我们决定照常发布 1.22.0,但同时也发布了包含补丁的 1.22.1。这个 bug 实际上在 Cargo 中,而不是 rustc,并且只影响 macOS High Sierra 用户。

如果你已经通过 rustup 安装了 Rust 的早期版本,那么获取 Rust 1.22.1 就像这样简单:

$ rustup update stable

如果你还没有安装 rustup,可以从我们网站上的相应页面获取 rustup,并查看 GitHub 上 1.22.0 和 1.22.1 的详细发布说明。

1.22.0 和 1.22.1 稳定版中有什么

此版本最重要的特性是许多人期待已久的:你现在可以将 ?Option<T> 一起使用了!大约一年前,在 Rust 1.13 中,我们引入了 ? 运算符来处理 Result<T, E>。从那时起,就一直在讨论 ? 应该有多大的适用范围:它应该只用于 Result 吗?它应该可由用户扩展吗?它应该可以用于 Option<T> 吗?

在 Rust 1.22 中,将 ?Option<T> 一起使用的基本用法现已稳定。以下代码现在可以编译通过:

fn add_one_to_first(list: &[u8]) -> Option<u8> {
    // get first element, if exists
    // return None if it doesn't
    let first = list.get(0)?;
    Some(first + 1)
}

assert_eq!(add_one_to_first(&[10, 20, 30]), Some(11));
assert_eq!(add_one_to_first(&[]), None);

然而,此功能仍有些限制;例如,你还不能在同一函数中使用 ? 来混合处理 Result 和 Option。这在将来是可能的,并且已经在 nightly Rust 中实现;敬请期待在未来的版本中听到更多关于此的消息。

实现了 Drop 的类型现在允许在 conststatic 项中使用。像这样:

struct Foo {
    a: u32,
}

impl Drop for Foo {
    fn drop(&mut self) {}
}

const F: Foo = Foo { a: 0 };
static S: Foo = Foo { a: 0 };

这项改变本身并没有带来太多东西,但随着我们改进在编译时计算事物的能力,conststatic 中将能实现越来越多的功能。

此外,还有一些小的改进,提高了开发体验

最近的两项编译器更改应该会加快调试模式下的编译速度。我们没有这些更改的具体数据可供承诺,但一如既往,编译时间对我们来说非常重要,我们正在继续努力改进它们。

T op= &T 现在适用于基本类型,这是一种花哨的说法,意思是

let mut x = 2;
let y = &8;

// this didn't work, but now does
x += y;

以前,你需要写成 x += *y 来进行解引用,所以这解决了一个小痛点。

MacOS 上的回溯信息得到了改进.

你现在可以在 Rustdoc 中创建 compile-fail 测试,像这样:

/// ```compile_fail
/// let x = 5;
/// x += 2; // shouldn't compile!
/// ```

请注意,这类测试可能比其他测试更脆弱,因为 Rust 的新增功能可能会导致代码在之前无法编译的情况下变得可以编译。例如,考虑第一个关于 ? 的宣布:那段代码在 Rust 1.21 上会编译失败,但在 Rust 1.22 上会成功编译,导致你的测试套件开始失败。

最后,我们移除了对 le32-unknown-nacl 目标的支持。Google 本身已经弃用了 PNaCl,转而支持 WebAssembly。你今天就可以将 Rust 代码编译到 WebAssembly,并可以期待在未来的版本中听到更多关于此的进展。

查看详细发布说明了解更多信息。

标准库稳定化

此版本稳定了一些新的 API

查看详细发布说明了解更多信息。

Cargo 特性

如果你有一个大型示例要展示给用户,Cargo 现在具备了构建多文件示例的能力,只需在 examples 内部创建一个包含 main.rs 的子目录即可。

Cargo 现在具备了vendoring git 仓库的能力

查看详细发布说明了解更多信息。

1.22.0 和 1.22.1 的贡献者

许多人共同努力创造了 Rust 1.22。没有你们所有人,这是不可能的。谢谢!(以及再次感谢!)