Rust 团队很高兴宣布 Rust 的新版本 1.79.0。Rust 是一种编程语言,它赋予每个人构建可靠且高效软件的能力。
如果您之前通过 rustup
安装了 Rust 的旧版本,您可以使用以下命令获取 1.79.0
$ rustup update stable
如果您还没有,您可以从我们网站上的相应页面 获取 rustup
,并查看 1.79.0 的详细发布说明。
如果您想通过测试未来的版本来帮助我们,您可以考虑在本地更新以使用 beta 频道 (rustup default beta
) 或 nightly 频道 (rustup default nightly
)。请 报告您遇到的任何错误!
1.79.0 稳定版中的新功能
const
表达式
内联 const { ... }
块现在在表达式位置稳定,允许显式进入 const 上下文,而无需额外的声明(例如,定义 const
项或特性的关联常量)。
与 const 项 (const ITEM: ... = ...
) 不同,内联 const 能够使用作用域内的泛型,并推断其类型而不是显式编写,这使得它们特别适用于内联代码片段。例如,像这样的模式
const EMPTY: Option<Vec<u8>> = None;
let foo = [EMPTY; 100];
现在可以这样写
let foo = [const { None }; 100];
值得注意的是,这对于泛型上下文也是如此,在以前需要使用带有关联常量的冗长特性声明
fn create_none_array<T, const N: usize>() -> [Option<T>; N] {
[const { None::<T> }; N]
}
这使得这段代码更加简洁易读。
有关详细信息,请参阅 参考文档。
关联类型位置的边界
Rust 1.79 稳定了关联项边界语法,它允许我们在其他边界内的关联类型位置放置边界,即 T: Trait<Assoc: Bounds...>
。这避免了需要提供额外的显式泛型类型来约束关联类型。
此功能允许在以前无法实现或对使用施加额外不必要的约束的几个地方指定边界
where
子句 - 在此位置,这等效于将边界分解为两个(或更多)where
子句。例如,where T: Trait<Assoc: Bound>
等效于where T: Trait, <T as Trait>::Assoc: Bound
。- 超特性 - 通过新语法指定的边界在使用特性时是隐含的,与 where 子句不同。示例语法:
trait CopyIterator: Iterator<Item: Copy> {}
。 - 关联类型项边界 - 这允许约束与特性的关联类型相关的嵌套严格投影。例如
trait Trait { type Assoc: Trait2<Assoc2: Copy>; }
。 - 不透明类型边界 (RPIT、TAIT) - 这允许约束与不透明类型相关的关联类型,而无需命名不透明类型。例如,
impl Iterator<Item: Copy>
定义了一个其项为Copy
的迭代器,而无需实际命名该项边界。
有关更多详细信息,请参阅 稳定性报告。
扩展自动临时生命周期扩展
在构造中立即引用的临时变量现在在 match
和 if
结构中自动扩展生命周期。这与块结构中临时变量的生命周期扩展具有相同的行为。
例如
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
};
此行为向后兼容,因为这些程序以前会编译失败。
标准库构建中启用了帧指针
Rust 项目分发的标准库现在使用 -Cforce-frame-pointers=yes
编译,使下游用户能够更轻松地分析其程序。请注意,标准库也继续提供行级调试信息(例如,DWARF),尽管在 Cargo 的发布配置文件中,这些信息 默认情况下会被剥离。
稳定的 API
{integer}::unchecked_add
{integer}::unchecked_mul
{integer}::unchecked_sub
<[T]>::split_at_unchecked
<[T]>::split_at_mut_unchecked
<[u8]>::utf8_chunks
str::Utf8Chunks
str::Utf8Chunk
<*const T>::is_aligned
<*mut T>::is_aligned
NonNull::is_aligned
<*const [T]>::len
<*mut [T]>::len
<*const [T]>::is_empty
<*mut [T]>::is_empty
NonNull::<[T]>::is_empty
CStr::count_bytes
io::Error::downcast
num::NonZero<T>
path::absolute
proc_macro::Literal::byte_character
proc_macro::Literal::c_string
这些 API 现在在 const 上下文中稳定
Atomic*::into_inner
io::Cursor::new
io::Cursor::get_ref
io::Cursor::position
io::empty
io::repeat
io::sink
panic::Location::caller
panic::Location::file
panic::Location::line
panic::Location::column
其他更改
查看 Rust、Cargo 和 Clippy 中的所有更改。
1.79.0 的贡献者
许多人共同创建了 Rust 1.79.0。没有你们,我们无法做到。 感谢!