宣布 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。这个错误实际上是在 Cargo 中,而不是在 rustc 中,并且只影响 macOS High Sierra 上的用户。

如果您通过 rustup 安装了以前版本的 Rust,获取 Rust 1.22.1 就像

$ rustup update stable

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

1.22.0 和 1.22.1 稳定版中的内容

此版本的标题功能是许多人期待已久的功能:您现在可以Option<T> 中使用 ?!大约一年前,在Rust 1.13 中,我们引入了 ? 运算符来处理 Result<T, E>。从那时起,一直有关于 ? 应该走多远的讨论:它应该只用于结果吗?它应该是用户可扩展的吗?它应该可以与 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);

但是,此功能仍然有点受限;例如,您还不能编写在同一个函数中混合使用结果和选项的代码。这将在未来成为可能,并且已经在 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 目标的支持。谷歌本身已弃用 PNaCl,而是将支持转向WebAssembly。您今天已经可以将 Rust 代码编译为 WebAssembly,并且您可以在未来的版本中听到更多关于此方面的进展。

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

库稳定化

此版本稳定了一些新的 API

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

Cargo 功能

如果您有一个大型示例要向用户展示,Cargo 已增强了构建多文件示例的能力,方法是在 examples 中创建一个包含 main.rs 的子目录。

Cargo 现在具有供应商 Git 仓库的能力。

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

1.22.0 和 1.22.1 的贡献者

许多人共同创建了 Rust 1.22。没有你们,我们无法做到。 谢谢!(以及再次感谢!