Rust 团队很高兴宣布 Rust 的新版本 1.33.0。Rust 是一门赋予每个人构建可靠且高效软件能力的编程语言。
如果您之前通过 rustup 安装了 Rust,升级到 Rust 1.33.0 非常简单,只需运行
$ rustup update stable
如果您尚未安装,可以从我们网站上的相应页面获取 rustup,并在 GitHub 上查看1.33.0 的详细发布说明。
1.33.0 stable 版本包含哪些内容
此版本中最大的两个特性是对 const fn 的显著改进以及一个新概念“ pinning ”的稳定。
const fn 改进
通过 const fn,您现在可以做更多的事情!具体来说
- 不可驳的解构模式 (例如
const fn foo((x, y): (u8, u8)) { ... }) let绑定 (例如let x = 1;)- 可变
let绑定 (例如let mut x = 1;) - 赋值 (例如
x = y) 和赋值运算符 (例如x += y) 表达式,即使赋值目标是投影 (例如结构体字段或索引操作,如x[3] = 42) - 表达式语句 (例如
3;)
您现在也能够在 const fn 中调用 const unsafe fn,如下所示
const unsafe
const
有了这些补充,标准库中更多的函数可以标记为 const。我们将在下面的库部分中列举它们。
Pinning (固定)
此版本为 Rust 程序引入了一个新概念,以两种类型实现:std::pin::Pin<P> 类型和Unpin 标记 trait。核心思想在std::pin 的文档中有详细阐述
有时,让对象保证不移动是很有用的,这意味着它们在内存中的位置不会改变,因此可以依赖它们。这种情况的一个主要例子是构建自引用结构体,因为移动一个带有指向自身的指针的对象会使其失效,从而可能导致未定义行为。
Pin<P>确保任何指针类型P的被指向者在内存中有一个稳定的位置,这意味着它不能被移动到其他地方,并且在被 drop 之前其内存不能被释放。我们说被指向者是“pinned”(固定)的。
此特性将主要由库作者使用,因此我们在此不会详细讨论。如果您有兴趣深入了解细节,请查阅文档。然而,此 API 的稳定对 Rust 用户总体而言很重要,因为它朝着一个备受期待的 Rust 特性:async/await 迈出了重要一步。我们还没完全达到目标,但此稳定使我们离它更近了一步。您可以在 areweasyncyet.rs 追踪所有必要的特性。
导入为 _
您现在可以将项导入为 _。这允许您导入 trait 的 impls,而无需在命名空间中拥有其名称。例如
use Read as _;
// Allowed as there is only one `Read` in the module.
有关更多详细信息,请参阅详细发布说明。
库稳定
以下是所有已标记为 const 的内容
- 方法
overflowing_{add, sub, mul, shl, shr}现在是所有数值类型的const函数。 - 方法
rotate_left,rotate_right, 和wrapping_{add, sub, mul, shl, shr}现在是所有数值类型的const函数。 - 方法
is_positive和is_negative现在是所有有符号数值类型的const函数。 - 所有
NonZero类型的get方法现在是const。 - 方法
count_ones,count_zeros,leading_zeros,trailing_zeros,swap_bytes,from_be,from_le,to_be,to_le现在是所有数值类型的const函数。 Ipv4Addr::new现在是一个const函数。
此外,这些 API 也已稳定
unix::FileExt::read_exact_at和unix::FileExt::write_all_atOption::transpose和Result::transposeconvert::identitypin::Pin和marker::Unpin(上面已提及)marker::PhantomPinnedVec::resize_with和VecDeque::resize_withDuration::as_millis,Duration::as_micros, 和Duration::as_nanos
有关更多详细信息,请参阅详细发布说明。
Cargo 特性
如果文件在初始构建期间被修改,Cargo 现在应该会重新构建 crate。
更多详细信息请参阅详细发布说明。
Crates.io
正如之前宣布的,与此版本同步,crates.io 将要求您拥有一个已验证的电子邮件地址才能发布。从协调世界时 2019年3月1日 00:00 开始,如果您没有已验证的电子邮件地址并运行 cargo publish,您将收到错误。
这确保我们可以遵守 DMCA 程序。如果您没有注意 Cargo 在上一个发布周期中打印的警告,请前往 crates.io/me 设置并验证您的电子邮件地址。此电子邮件地址永远不会公开显示,只会用于 crates.io 的操作。
1.33.0 的贡献者
许多人共同努力才有了 Rust 1.33.0。没有大家的支持,我们不可能做到。感谢!