Rust 团队很高兴地宣布 Rust 的最新版本 1.19.0。Rust 是一门专注于安全、速度和并发性的系统编程语言。
如果您已经安装了之前版本的 Rust,获取 Rust 1.19 就像运行以下命令一样简单:
如果您还没有安装,可以从我们网站上的相应页面获取 rustup,并在 GitHub 上查看1.19.0 的详细发布说明。
1.19.0 stable 版本有什么新特性?
Rust 1.19.0 包含一些期待已久的功能,但首先,为我们的 Windows 用户提供一个说明。在 Windows 上,Rust 依赖 link.exe 进行链接,您可以通过“Microsoft Visual C++ Build Tools”获取它。随着 Visual Studio 2017 的近期发布,这些工具的目录结构发生了变化。因此,要使用 Rust,您必须继续使用 2015 版的工具或使用变通方法(例如运行 vcvars.bat)。在 1.19.0 中,rustc 现在知道如何找到 2017 版的工具,因此无需变通方法即可使用。
接下来是新功能!Rust 1.19.0 是第一个支持 unions 的版本。
union MyUnion
联合(Union)有点像 enum,但它们是“无标签的”。枚举(Enum)有一个“标签”,在运行时存储哪个变体是正确的;联合则省略了这个标签。
由于我们可以使用错误的变体来解释联合中持有的数据,而 Rust 无法为我们检查这一点,这意味着读取或写入联合的字段是不安全的(unsafe)。
let u = MyUnion ;
unsafe ;
let value = unsafe ;
模式匹配也适用:
联合何时有用?一个主要用例是与 C 语言的互操作性。C API 可能(并且根据领域不同,经常会)暴露联合,因此这使得为这些库编写 API 包装器变得更加容易。此外,根据其 RFC:
原生联合机制还将简化 Rust 中依赖于值表示(value representation)来提高空间效率或缓存效率的结构实现,例如使用对齐指针的最低有效位来区分情况的机器字大小的联合。
这项功能期待已久,未来还将有更多改进。目前,union 只能包含 Copy 类型,并且不能实现 Drop。我们期望将来取消这些限制。
顺便提一下,您是否曾想过 Rust 是如何添加新功能的?这项功能是由 Josh Triplett 提出的,他在 2016 年的 RustConf 上做了一个关于将
union加入 Rust 的过程的演讲。您应该看看!
// old code
let x;
loop
// new code
let x = loop ;
Rust 传统上将自己定位为一门“面向表达式的语言”(expression oriented language),也就是说,大多数事物都是评估为一个值的表达式,而不是语句。loop 在这方面显得很奇怪,因为它之前是一个语句。
其他形式的循环呢?目前尚不清楚。请参阅其 RFC 以了解关于此处的未决问题的一些讨论。
一个较小的功能是,不捕获环境的闭包(closure)现在可以被强制转换为函数指针:
let f: fn = ;
我们现在生成 xz 压缩的 tar 包并默认优先使用它们,使得数据传输更小更快。如果您因某些原因无法使用 xz,仍然会生成 gzip 压缩的 tar 包。
编译器现在可以在 Android 上自举(bootstrap)。我们长期以来以各种方式支持 Android,这项改进继续增强了我们的支持。
最后,一个兼容性说明。早在我们发布 Rust 1.0 之前,我们进行了一项大规模工作,以验证所有被标记为 stable 和 unstable 的内容。然而,我们忽略了一件事:-Z 标志。编译器的 -Z 标志用于启用不稳定标志。与其他稳定性机制不同,您仍然可以在 stable Rust 上使用 -Z。早在 2016 年 4 月的 Rust 1.8 版本中,我们在 stable 或 beta 版本上使用 -Z 会产生警告。一年多后,我们通过禁止在 stable 和 beta 版本上使用 -Z 来弥补我们稳定性机制上的这个漏洞。
请查看详细发布说明以了解更多信息。
标准库稳定化
最大的新库功能是 eprint! 和 eprintln! 宏。它们的工作方式与 print! 和 println! 完全相同,但不是写入标准输出,而是写入标准错误。
其他新功能
String现在实现了FromIterator<Cow<'a, str>>和Extend<Cow<'a, str>>Vec现在实现了From<&mut [T]>Box<[u8]>现在实现了From<Box<str>>SplitWhitespace现在实现了Clone-
[u8]::reverse现在快了 5 倍,[u16]::reverse现在快了 1.5 倍
以及一些新近稳定化的 API
请查看详细发布说明以了解更多信息。
Cargo 功能
本次发布中,Cargo 主要获得了一些虽小但很有价值的改进。其中最大的改进可能是 Cargo 不再为 crates.io 索引检出本地工作目录。这应该会减小注册表的文件大小并加快克隆时间,尤其是在 Windows 机器上。
其他改进
- 构建脚本现在可以将环境变量添加到 crate 正在编译的环境中。示例:
println!("cargo:rustc-env=FOO=bar"); - 工作区成员现在可以接受 glob 文件模式
- 为
cargo bench子命令添加了--all标志,用于运行给定工作区中所有成员的基准测试。 - 添加了
--exclude选项,用于在使用--all选项时排除特定包 --features选项现在接受多个逗号或空格分隔的值。- 增加了对自定义目标特定 runner 的支持
请查看详细发布说明以了解更多信息。
1.19.0 的贡献者
许多人齐心协力创建了 Rust 1.19。没有大家的贡献,这一切都不可能实现。谢谢!