Rust 团队很高兴地宣布 Rust 的新版本 1.33.0。 Rust 是一种编程语言,它使每个人都能够构建可靠且高效的软件。
如果您通过 rustup 安装了之前的 Rust 版本,那么获取 Rust 1.33.0 就像下面这样简单:
$ rustup update stable
如果您还没有安装,您可以从我们网站的相应页面获取 rustup,并查看 GitHub 上1.33.0 的详细发布说明。
1.33.0 稳定版的新特性
此版本中最大的两个特性是对 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 fn foo() -> i32 { 5 }
const fn bar() -> i32 {
unsafe { foo() }
}
有了这些新增功能,标准库中更多的函数可以标记为 const。 我们将在下面的库部分中列举这些函数。
Pinning
此版本为 Rust 程序引入了一个新概念,它以两种类型的形式实现:std::pin::Pin<P> 类型和 Unpin 标记 trait。 核心思想在 std::pin 的文档中详细阐述。
有时,拥有保证不移动的对象很有用,也就是说它们在内存中的位置不会改变,因此可以依赖它们。这种场景的一个主要示例是构建自引用结构体,因为移动带有指向自身的指针的对象会使它们失效,这可能会导致未定义的行为。
Pin<P>确保任何指针类型P的被指向者在内存中具有稳定的位置,这意味着它不能被移动到其他地方,并且在它被丢弃之前,它的内存不能被释放。我们说被指向者被“固定”了。
此功能主要由库作者使用,因此我们在此不做过多细节讨论。如果您有兴趣深入了解细节,请查阅文档。 然而,此 API 的稳定对 Rust 用户来说非常重要,因为它朝着一个备受期待的 Rust 功能迈出了重要一步:async/await。我们尚未完全实现,但此稳定化使我们离目标更近了一步。 您可以在 areweasyncyet.rs 上跟踪所有必要的功能。
导入为 _
您现在可以将一个项导入为 _。这允许您导入 trait 的实现,而无需在命名空间中包含该名称。 例如:
use std::io::Read as _;
// Allowed as there is only one `Read` in the module.
pub trait Read {}
有关更多详细信息,请参阅详细发布说明。
库稳定化
以下是所有被标记为 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-03-01 00:00 UTC 开始,如果您没有经过验证的电子邮件地址并运行 cargo publish,您将收到错误。
这确保我们可以遵守 DMCA 程序。如果您没有注意上一个发布周期中 cargo 打印的警告,请前往 crates.io/me 设置并验证您的电子邮件地址。此电子邮件地址将永远不会公开显示,仅用于 crates.io 操作。
1.33.0 的贡献者
许多人齐心协力创建了 Rust 1.33.0。没有你们所有人,我们就无法做到这一点。 谢谢!