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
,并查看 GitHub 上1.22.0 的详细发布说明和 1.22.1。
1.22.0 和 1.22.1 稳定版中的内容
此版本的标题功能是许多人期待已久的功能:您现在可以在 Option<T>
中使用 ?
!大约一年前,在Rust 1.13 中,我们引入了 ?
运算符来处理 Result<T, E>
。从那时起,一直有关于 ?
应该走多远的讨论:它应该只用于结果吗?它应该是用户可扩展的吗?它应该可以与 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);
但是,此功能仍然有点受限;例如,您还不能编写在同一个函数中混合使用结果和选项的代码。这将在未来成为可能,并且已经在 nightly Rust 中实现了;预计在未来的版本中将有更多关于此方面的消息。
实现 Drop
的类型现在允许在 const
和 static
项目中使用。像这样
struct Foo {
a: u32,
}
impl Drop for Foo {
fn drop(&mut self) {}
}
const F: Foo = Foo { a: 0 };
static S: Foo = Foo { a: 0 };
此更改本身并没有带来太多,但随着我们改进在编译时计算事物的能力,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
目标的支持。谷歌本身已弃用 PNaCl,而是将支持转向WebAssembly。您今天已经可以将 Rust 代码编译为 WebAssembly,并且您可以在未来的版本中听到更多关于此方面的进展。
查看详细的发布说明以了解更多信息。
库稳定化
此版本稳定了一些新的 API
Box<Error>
现在实现From<Cow<str>>
std::mem::Discriminant
现在保证是Send + Sync
fs::copy
现在在 NTFS 上返回主流的长度。- 正确检测
Instant += Duration
中的溢出。 - 实现
Hasher
用于{&mut Hasher, Box<Hasher>}
- 实现
fmt::Debug
用于SplitWhitespace
。
查看详细的发布说明以了解更多信息。
Cargo 功能
如果您有一个大型示例要向用户展示,Cargo 已增强了构建多文件示例的能力,方法是在 examples
中创建一个包含 main.rs
的子目录。
Cargo 现在具有供应商 Git 仓库的能力。
查看详细的发布说明以了解更多信息。