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 上下文,而无需额外的声明(例如,在 trait 上定义 const
项或关联常量)。
与 const 项 (const ITEM: ... = ...
) 不同,内联 const 可以利用作用域内的泛型,并推断其类型而不是显式写入,这使得它们对于内联代码片段特别有用。例如,像这样的模式
const EMPTY: Option<Vec<u8>> = None;
let foo = [EMPTY; 100];
现在可以这样写
let foo = [const { None }; 100];
值得注意的是,这也适用于泛型上下文,在泛型上下文中,以前需要带有关联常量的冗长 trait 声明
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
。- 超 trait - 通过新语法指定的约束在 trait 被使用时是隐含的,这与 where 子句不同。示例语法:
trait CopyIterator: Iterator<Item: Copy> {}
。 - 关联类型项约束 - 这允许约束与 trait 的关联类型关联的嵌套刚性投影。例如
trait Trait { type Assoc: Trait2<Assoc2: Copy>; }
。 - 不透明类型约束 (RPIT, TAIT) - 这允许约束与不透明类型关联的关联类型,而无需命名不透明类型。例如,
impl Iterator<Item: Copy>
定义了一个 item 是Copy
的迭代器,而无需实际命名该 item 约束。
有关更多详细信息,请参阅稳定化报告。
扩展自动临时生命周期延长
在 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。没有你们所有人,我们不可能做到。谢谢!