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,可以从我们网站上的相应页面获取 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> 一起使用的基本用法现已稳定。以下代码现在可以编译通过:
assert_eq!;
assert_eq!;
然而,此功能仍有些限制;例如,你还不能在同一函数中使用 ? 来混合处理 Result 和 Option。这在将来是可能的,并且已经在 nightly Rust 中实现;敬请期待在未来的版本中听到更多关于此的消息。
实现了 Drop 的类型现在允许在 const 和 static 项中使用。像这样:
const F: Foo = Foo ;
static S: Foo = Foo ;
这项改变本身并没有带来太多东西,但随着我们改进在编译时计算事物的能力,const 和 static 中将能实现越来越多的功能。
此外,还有一些小的改进,提高了开发体验
最近的两项编译器更改应该会加快调试模式下的编译速度。我们没有这些更改的具体数据可供承诺,但一如既往,编译时间对我们来说非常重要,我们正在继续努力改进它们。
T op= &T 现在适用于基本类型,这是一种花哨的说法,意思是
let mut x = 2;
let y = &8;
// this didn't work, but now does
x += y;
以前,你需要写成 x += *y 来进行解引用,所以这解决了一个小痛点。
你现在可以在 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
Box<Error>现在实现了From<Cow<str>>std::mem::Discriminant现在保证是Send + Syncfs::copy现在在 NTFS 上返回主数据流的长度。- 在
Instant += Duration中正确检测溢出。 - 为
{&mut Hasher, Box<Hasher>}实现Hasher - 为
SplitWhitespace实现fmt::Debug。
查看详细发布说明了解更多信息。
Cargo 特性
如果你有一个大型示例要展示给用户,Cargo 现在具备了构建多文件示例的能力,只需在 examples 内部创建一个包含 main.rs 的子目录即可。
Cargo 现在具备了vendoring git 仓库的能力。
查看详细发布说明了解更多信息。