Rust 1.33发布,常数中let绑定以及解构现已稳定可用

Rust官方发布1.33新版,改进了const fn,以及加入已达稳定的新概念Pinning,能使目标对象在内存中保有稳定位置,直到被解除分配。

const fn的改进,让开发者现在可以使用更多以前无法使用的语法。像是不可辩驳的解构样式(Irrefutable Destructuring Patterns),使用方式可为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 fn的改进,更多标准函数库中的函数可以标记为const。而在接下来的版本,继续会也有更多const语法可用,包括可变参照&mut T,或是可辩驳的样式Some(x),而虽然let绑定已经稳定,但是在常数中使用&&以及||却尚未稳定,开发者还需要再等等。

第二个主要更新则是加入Pinning的概念,以std::pin::Pin

类型以及Unpin标记特征实例。官方提到,Pinning对于那些保证不移动的对象有时候很有用,因为这些对象在内存中的位置不会移动,因此能依赖其上,像是在构建自参照结构时,因为移动指向对象本身的指标,将使其无效,并可能出现未定义的行为。而 Pin将能确保任何指标类型P都在内存中有稳定的位置,无法被移动到其他地方,而且在解除分配之前,都不能释放内存。

这个功能主要供函数库开发者使用,官方提到,这个API的稳定性对Rust开发者来说非常重要,因为是Rust朝向提供async/await异步功能的重要一步。