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,您可以从我们网站上的相应页面获取 rustup
,并查看 GitHub 上1.22.0 的详细发布说明和 1.22.1。
1.22.0 和 1.22.1 稳定版中的新特性
此版本的主要特性是许多人期待已久的功能:您现在可以将 ?
与 Option<T>
一起使用了!大约一年前,在Rust 1.13中,我们引入了用于处理 Result<T, E>
的 ?
运算符。从那时起,人们一直在讨论 ?
应该走多远:它应该只用于 results 吗?它应该是用户可扩展的吗?它应该与 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);
但是,此功能仍然有点受限;例如,您还不能在同一个函数中编写将 results 和 options 与 ?
混合使用的代码。这在未来是可能实现的,并且在 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
目标的支持。Google 本身已弃用 PNaCl,转而支持WebAssembly。您现在就可以将 Rust 代码编译为 WebAssembly,并且在未来的版本中,您将听到更多有关这方面的进展。
有关更多信息,请参阅详细的发布说明。
库的稳定化
此版本中稳定了一些新的 API
Box<Error>
现在实现了From<Cow<str>>
std::mem::Discriminant
现在保证是Send + Sync
fs::copy
现在返回 NTFS 上主流的长度。- 正确检测
Instant += Duration
中的溢出。 - 为
{&mut Hasher, Box<Hasher>}
实现Hasher
。 - 为
SplitWhitespace
实现fmt::Debug
。
有关更多信息,请参阅详细的发布说明。
Cargo 功能
如果您有一个大型示例要向用户展示,Cargo 现在可以通过在包含 main.rs
的 examples
内部创建一个子目录来构建多文件示例。
Cargo 现在有能力vendor git 存储库。
有关更多信息,请参阅详细的发布说明。