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++ Build Tools”获取它。随着 Visual Studio 2017 的最新发布,这些工具的目录结构发生了变化。因此,要使用 Rust,您必须使用 2015 年的工具或使用变通方法(例如运行 vcvars.bat
)。在 1.19.0 中,rustc
现在知道如何找到 2017 年的工具,因此它们无需变通方法即可正常工作。
现在让我们来看看新功能!Rust 1.19.0 是第一个支持union
的版本。
union MyUnion {
f1: u32,
f2: f32,
}
union
类似于 enum
,但它们是“无标记的”。enum
拥有一个“标记”,用于在运行时存储哪个变体是正确的;union
则省略了这个标记。
由于我们可以使用错误的变体来解释 union
中保存的数据,而 Rust 无法为我们检查这一点,这意味着读取或写入 union
的字段是不安全的。
let u = MyUnion { f1: 1 };
unsafe { u.f1 = 5 };
let value = unsafe { u.f1 };
模式匹配也支持 union
。
fn f(u: MyUnion) {
unsafe {
match u {
MyUnion { f1: 10 } => { println!("ten"); }
MyUnion { f2 } => { println!("{}", f2); }
}
}
}
union
在哪些情况下有用?一个主要的用例是与 C 的互操作性。C API 可以(并且根据领域的不同,通常会)公开 union
,因此这使得为这些库编写 API 包装器变得更加容易。此外,从其 RFC中可以看出:
一个原生的
union
机制还可以简化 Rust 对依赖于值表示的空间高效或缓存高效结构的实现,例如使用对齐指针的最低有效位来区分情况的机器字大小的union
。
这个功能已经期待已久,并且还有更多改进即将到来。目前,union
只能包含 Copy
类型,并且不能实现 Drop
。我们预计将来会解除这些限制。
顺便说一下,您是否曾经想过 Rust 的新功能是如何添加的?这个功能是由 Josh Triplett 提出的,他在RustConf 2016 上发表了演讲,介绍了将
union
添加到 Rust 的过程。您应该去看看!
// 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,并且这将继续改善我们对 Android 的支持。
最后,一个关于兼容性的说明。早在我们准备 Rust 1.0 的时候,我们做了大量的努力来验证所有被标记为稳定和不稳定的东西。然而,我们忽略了一件事:-Z
标志。编译器的 -Z
标志用于启用不稳定的标志。与我们其他稳定性故事不同的是,您仍然可以在稳定的 Rust 上使用 -Z
。早在 2016 年 4 月的 Rust 1.8 中,我们让在稳定版或测试版上使用 -Z
会产生警告。一年多之后,我们通过禁止在稳定版和测试版上使用 -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 机器上。
其他改进
- 构建脚本现在可以将环境变量添加到编译箱子的环境中。例如:
println!("cargo:rustc-env=FOO=bar");
- 工作区成员现在可以接受通配符文件模式
- 为
cargo bench
子命令添加了--all
标志,用于运行给定工作区中所有成员的基准测试。 - 添加了
--exclude
选项,用于在使用--all
选项时排除某些包。 --features
选项现在可以接受多个用逗号或空格分隔的值。- 添加了对自定义目标特定运行器的支持
请参阅详细的发布说明以了解更多信息。
1.19.0 的贡献者
许多人共同创建了 Rust 1.19。没有你们,我们无法做到。感谢!