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,您可以从我们网站上的相应页面获取 rustup,并查看 GitHub 上1.22.0 的详细发布说明和 1.22.1。

1.22.0 和 1.22.1 稳定版中的新特性

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

但是,此功能仍然有点受限;例如,您还不能在同一个函数中编写将 results 和 options 与 ? 混合使用的代码。这在未来是可能实现的,并且在 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 现在可以通过在包含 main.rsexamples 内部创建一个子目录来构建多文件示例

Cargo 现在有能力vendor git 存储库

有关更多信息,请参阅详细的发布说明

1.22.0 和 1.22.1 的贡献者

很多人共同努力创建了 Rust 1.22。没有你们大家,我们不可能做到这一点。感谢!(以及再次感谢!