Rust 团队很高兴宣布 Rust 的新版本 1.50.0。Rust 是一种编程语言,它赋予每个人构建可靠高效软件的能力。
如果您之前通过 rustup 安装了 Rust,获取 Rust 1.50.0 就像以下操作一样简单:
$ rustup update stable
如果您还没有安装,您可以从我们网站上的相应页面获取 rustup
,并查看 GitHub 上的1.50.0 的详细发布说明。
1.50.0 稳定版中的新内容
在这个版本中,我们改进了数组索引,扩展了对联合字段的安全访问,并对标准库进行了补充。查看详细的发布说明,了解本文未涵盖的其他更改。
常量泛型数组索引
为了继续推进稳定版 const
泛型,此版本为任何长度的 const N
的数组 [T; N]
添加了 ops::Index
和 IndexMut
的实现。索引运算符 []
已经通过内置的编译器魔法在数组上工作,但在类型级别,数组直到现在才真正实现了库特征。
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>
联合字段的安全赋值
对 Rust 1.49 使得将 ManuallyDrop<T>
字段添加到 union
成为可能,这是允许 union
使用 Drop
的一部分。但是,联合在分配字段时不会丢弃旧值,因为它们不知道哪个变体以前是有效的,因此安全的 Rust 以前将此限制为仅 Copy
类型,这些类型永远不会 Drop
。当然,ManuallyDrop<T>
也不需要 Drop
,因此现在 Rust 1.50 也允许对这些字段进行安全赋值。
File
提供一个利基
在 Unix 平台上为 Rust 中的某些类型对被认为是有效值的范围有特定限制,这可能不涵盖所有可能的内存值范围。我们将任何剩余的无效值称为利基,此空间可用于类型布局优化。例如,在 Rust 1.28 中,我们引入了 NonZero
整数类型(如 NonZeroU8
),其中 0
是一个利基,这使得 Option<NonZero>
可以使用 0
来表示 None
,而无需额外的内存。
在 Unix 平台上,Rust 的 File
仅仅由系统的整数文件描述符组成,而这恰好也可能有一个利基,因为它永远不可能是 -1
!返回文件描述符的系统调用使用 -1
来指示发生了错误(检查 errno
),因此 -1
永远不可能是真正的文件描述符。从 Rust 1.50 开始,此利基被添加到类型的定义中,以便它也可以用于布局优化。因此,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
。 - 所有整数类型的
checked_pow
。 - 所有整数类型的
saturating_pow
。 - 所有整数类型的
wrapping_pow
。 - 所有无符号整数类型的
next_power_of_two
。 - 所有无符号整数类型的
checked_power_of_two
。
查看详细的发布说明,了解其他更改。
其他更改
Rust 1.50.0 版本中还有其他更改:查看Rust、Cargo 和Clippy 中发生了哪些变化。
1.50.0 的贡献者
许多人共同创建了 Rust 1.50.0。没有你们,我们不可能做到。 谢谢!