Rust 团队很高兴地宣布 Rust 的新版本 1.50.0。Rust 是一种编程语言,旨在帮助所有人构建可靠且高效的软件。
如果你之前通过 rustup 安装了 Rust,那么获取 Rust 1.50.0 版本非常简单,只需运行:
$ rustup update stable
如果你还没有安装,你可以从我们网站的相应页面 获取 rustup
,并查看 GitHub 上 1.50.0 版本的详细发行说明。
1.50.0 稳定版有哪些新功能
在此版本中,我们改进了数组索引,扩展了对 union 字段的安全访问,并向标准库添加了一些新功能。请参阅详细发行说明以了解本文未涵盖的其他更改。
常量泛型数组索引
为了继续向稳定的 const
泛型迈进,此版本为任意长度 const N
的数组 [T; N]
添加了 ops::Index
和 IndexMut
的实现。索引运算符 []
已经通过内置的编译器魔法在数组上工作,但在类型级别,数组实际上直到现在才实现库 traits。
fn second<C>(container: &C) -> &C::Output
where
C: std::ops::Index<usize> + ?Sized,
{
&container[1]
}
fn main() {
let array: [i32; 3] = [1, 2, 3];
assert_eq!(second(&array[..]), &2); // slices worked before
assert_eq!(second(&array), &2); // now it also works directly
}
const
值重复
数组的 Rust 中的数组可以写成列表形式 [a, b, c]
或重复形式 [x; N]
。对于长度 N
大于 1 的情况,重复形式仅允许 x
为 Copy
类型,而 RFC 2203 旨在允许任何 const
表达式。然而,虽然该功能对于任意表达式来说是不稳定的,但自 Rust 1.38 以来的实现意外地允许在数组重复中使用稳定的 const
值。
fn main() {
// This is not allowed, because `Option<Vec<i32>>` does not implement `Copy`.
let array: [Option<Vec<i32>>; 10] = [None; 10];
const NONE: Option<Vec<i32>> = None;
const EMPTY: Option<Vec<i32>> = Some(Vec::new());
// However, repeating a `const` value is allowed!
let nones = [NONE; 10];
let empties = [EMPTY; 10];
}
在 Rust 1.50 中,这种稳定化得到了正式承认。在未来,为了避免这种“临时”命名常量,你可以期待根据 RFC 2920 使用内联 const
表达式。
ManuallyDrop<T>
union 字段
安全地赋值给 Rust 1.49 允许向 union
添加 ManuallyDrop<T>
字段,这是允许 union 实现 Drop
的一部分。然而,当字段被赋值时,union 不会 drop 旧值,因为它们不知道哪个变体以前是有效的,因此安全的 Rust 之前仅将其限制为永远不会 Drop
的 Copy
类型。当然,ManuallyDrop<T>
也不需要 Drop
,因此现在 Rust 1.50 也允许安全地赋值给这些字段。
File
类型的 niche 优化
Unix 平台上的 Rust 中的某些类型对被认为是有效值的内容有特定的限制,这可能无法覆盖整个可能的内存值范围。我们将任何剩余的无效值称为 niche,此空间可用于类型布局优化。例如,在 Rust 1.28 中,我们引入了 NonZero
整数类型(如 NonZeroU8
),其中 0
是一个 niche,这使得 Option<NonZero>
可以使用 0
来表示 None
,而无需额外的内存。
在 Unix 平台上,Rust 的 File
只是由系统的整数文件描述符组成,而这恰好也有一个可能的 niche,因为它永远不可能是 -1
!返回文件描述符的系统调用使用 -1
来指示发生了错误(检查 errno
),因此 -1
永远不可能是一个真实的文件描述符。从 Rust 1.50 开始,此 niche 已添加到类型的定义中,因此也可以用于布局优化。因此,Option<File>
现在将与 File
本身具有相同的大小!
标准库变更
在 Rust 1.50.0 中,有九个新的稳定函数:
bool::then
btree_map::Entry::or_insert_with_key
f32::clamp
f64::clamp
hash_map::Entry::or_insert_with_key
Ord::clamp
RefCell::take
slice::fill
UnsafeCell::get_mut
并且很多现有的函数被设为了 const
:
IpAddr::is_ipv4
IpAddr::is_ipv6
Layout::size
Layout::align
Layout::from_size_align
pow
for all integer types.checked_pow
for all integer types.saturating_pow
for all integer types.wrapping_pow
for all integer types.next_power_of_two
for all unsigned integer types.checked_power_of_two
for all unsigned integer types.
请参阅详细发行说明以了解其他更改。
其他更改
Rust 1.50.0 版本中还有其他更改:请查看 Rust、Cargo 和 Clippy 中的更改。
1.50.0 的贡献者
很多人齐心协力创建了 Rust 1.50.0。没有你们所有人,我们不可能做到。谢谢!