Rust 新版解读 | 1.79 | 内联 const,临时变量生命周期延长

Rust 1.79 官方 release doc: Announcing Rust 1.79.0 | Rust Blog

通过 rustup 安装的同学可以使用以下命令升级到 1.79 版本:

$ rustup update stable

内联 const 表达式

如今可以写内联 const 块 const {...} 作为表达式,显式地进入 const 上下文,而不需要额外的声明(例如,定义 const 常量或 Trait 的关联常量)。

与 const 常量 const ITEM: ... = ... 不同,内联 const 里类型可以被推断而不需要显式写出,并且还能使用泛型参数。来看一个很实用的例子:

#![allow(unused)]
fn main() {
const EMPTY: Option<Vec<u8>> = None;
let foo = [EMPTY; 100];
}

如今可以写成如下形式,(foo 的类型 Option<T> 可以不标注,可以根据上下文推断出来)

#![allow(unused)]
fn main() {
let foo = [const { None }; 100];
}

泛型的例子:

#![allow(unused)]
fn main() {
fn create_none_array<T, const N: usize>() -> [Option<T>; N] {
    [const { None }; N]
}
}

更多细节见参考文档

关联类型约束

Rust 1.79 稳定了一些关联类型约束的语法,允许我们在类型约束里写其它类型约束,即 T: Trait<Assoc: Bounds...>。这避免了提供额外的显式泛型类型来约束关联类型。

这个新特性允许我们在一些情况下更简单地指定好约束关系,解决了一些之前不可能或者会引入额外不必要约束的场景。

  • where 子句 - 在这个位置,这等同于将约束拆分为两个(或更多)where 语句。例如,where T: Trait<Assoc: Bound> 等同于 where T: Trait, <T as Trait>::Assoc: Bound
  • Supertraits - 类似于上面,trait CopyIterator: Iterator<Item: Copy> {}。这也等同于将约束拆分为两个(或更多)where 语句;不过当 trait 被使用时,这个对关联类型 Item 的约束是隐含的。
  • 关联类型 Item 约束 - 允许约束与 trait 的关联类型相关的嵌套类型约束。例如 trait Trait { type Assoc: Trait2<Assoc2: Copy>; }
  • 模糊类型约束(RPIT: return position impl Trait, TAIT: type alias impl Trait) - 允许约束与模糊类型相关的关联类型。例如 impl Iterator<Item: Copy> 定义了 Item 满足 Copy 的迭代器,而不必实际命名该约束。

更多细节见 issue

译注:很绕,但是整体上就是一次让 Rust 编译器变得更符合你期望它应该正常工作的样子的更新。

临时变量生命周期延长

现在,在 matchif 结构中构造并立刻被使用的临时变量的生命周期会自动延长。这与代码结构中的临时变量生命周期延长的效果一致。

#![allow(unused)]
fn main() {
let a = if true {
    ..;
    &temp() // used to error, but now gets lifetime extended
} else {
    ..;
    &temp() // used to error, but now gets lifetime extended
};

let a = match () {
    _ => {
        ..;
        &temp() // used to error, but now gets lifetime extended
    }
};

// 之前已有的代码块临时变量生命周期延长
let a = {
    ..;
    &temp() // lifetime is extended
};
}

Others

其它更新细节,和稳定的 API 列表,参考原Blog