Rust 1.19 发布

2017年7月20日 · Rust 核心团队

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

如果您已安装了先前版本的 Rust,则获取 Rust 1.19 非常简单,只需运行:

$ rustup update stable

如果您还没有安装,您可以从我们网站上的相应页面获取 rustup,并查看 GitHub 上1.19.0 的详细发行说明

1.19.0 稳定版的新特性

Rust 1.19.0 具有一些期待已久的功能,但首先,给我们的 Windows 用户一个提示。在 Windows 上,Rust 依赖 link.exe 进行链接,您可以通过“Microsoft Visual C++ 生成工具”获取它。随着 Visual Studio 2017 最近的发布,这些工具的目录结构发生了变化。因此,要使用 Rust,您必须坚持使用 2015 工具或使用解决方法(例如运行 vcvars.bat)。在 1.19.0 中,rustc 现在知道如何找到 2017 工具,因此它们无需任何解决方法即可工作。

接下来是新功能!Rust 1.19.0 是第一个支持 union 的版本

union MyUnion {
    f1: u32,
    f2: f32,
}

联合体有点像 enum,但它们是“无标记”的。枚举有一个“标记”,用于存储运行时哪个变体是正确的;联合体省略了这个标记。

由于我们可以使用错误的变体来解释联合体中保存的数据,而 Rust 无法为我们检查这一点,这意味着读取或写入联合体的字段是不安全的

let u = MyUnion { f1: 1 };

unsafe { u.f1 = 5 };

let value = unsafe { u.f1 };

模式匹配也有效

fn f(u: MyUnion) {
    unsafe {
        match u {
            MyUnion { f1: 10 } => { println!("ten"); }
            MyUnion { f2 } => { println!("{}", f2); }
        }
    }
}

何时使用联合体?一个主要用例是与 C 的互操作性。C API 可以(并且根据领域,通常会)公开联合体,因此这使得为这些库编写 API 包装器变得容易得多。此外,来自 其 RFC

原生联合机制还将简化 Rust 对依赖于值表示的空间高效或缓存高效结构的实现,例如使用对齐指针的最低有效位来区分情况的机器字大小联合体。

这个功能已经期待已久,而且还有更多的改进即将到来。目前,union 只能包含 Copy 类型,并且不能实现 Drop。我们希望在将来解除这些限制。

顺便说一句,您是否想过新功能是如何添加到 Rust 的?此功能由 Josh Triplett 提出,他在 RustConf 2016 上发表了关于将 union 引入 Rust 过程的演讲。您应该去看看!

在其他新闻中,loop 现在可以使用值 break

// old code
let x;

loop {
    x = 7;
    break;
}

// new code
let x = loop { break 7; };

传统上,Rust 将自己定位为“面向表达式的语言”,也就是说,大多数事物都是计算为值的表达式,而不是语句。loop 以这种方式显得很奇怪,因为它以前是一个语句。

其他形式的循环呢?目前还不清楚。请参阅 其 RFC 以了解有关此处开放问题的一些讨论。

一个小功能,不捕获环境的闭包现在可以强制转换为函数指针

let f: fn(i32) -> i32 = |x| x + 1;

我们现在生成 xz 压缩的 tarball,并默认首选它们,从而使数据传输更小、更快。如果您出于某种原因无法使用 xz,仍然会生成 gzip 压缩的 tarball。

编译器现在可以在 Android 上引导。我们长期以来以各种方式支持 Android,这将继续改进我们的支持。

最后,一个兼容性说明。早在我们准备发布 Rust 1.0 时,我们曾大力推动验证所有被标记为稳定和不稳定的内容。然而,我们忽略了一件事:-Z 标志。编译器的 -Z 标志启用不稳定的标志。与我们其余的稳定性故事不同,您仍然可以在稳定的 Rust 上使用 -Z。早在 2016 年 4 月,在 Rust 1.8 中,我们使在稳定版或测试版上使用 -Z 产生警告。一年多后,我们通过禁止在稳定版和测试版上使用 -Z 来修复我们稳定性故事中的这个漏洞。

请参阅详细发行说明以了解更多信息。

库的稳定化

最大的新库功能是 eprint!eprintln!。它们的工作方式与 print!println! 完全相同,但它们写入标准错误,而不是标准输出。

其他新功能

以及一些新稳定的 API

请参阅详细发行说明以了解更多信息。

Cargo 功能

Cargo 在此版本中主要获得了一些小但有价值的改进。最大可能是Cargo 不再为 crates.io 索引检出本地工作目录。这应该为注册表提供更小的文件大小并提高克隆时间,尤其是在 Windows 机器上。

其他改进

请参阅详细发行说明以了解更多信息。

1.19.0 的贡献者

许多人共同创造了 Rust 1.19。没有大家,我们不可能做到这一点。谢谢!