Rust 团队很高兴地宣布 Rust 的新版本 1.28.0。Rust 是一种专注于安全性、速度和并发性的系统编程语言。
如果您之前通过 rustup 安装了 Rust 版本,那么获取 Rust 1.28.0 非常简单,只需执行:
$ rustup update stable
如果您还没有安装,您可以从我们网站的相应页面获取 rustup
,并查看 GitHub 上1.28.0 的详细发行说明。
1.28.0 稳定版的新特性
全局分配器
分配器是 Rust 程序在运行时从系统获取内存的方式。以前,Rust 不允许更改内存获取的方式,这阻止了一些用例。在某些平台上,这意味着使用 jemalloc,在其他平台上,使用系统分配器,但用户无法控制这个关键组件。在 1.28.0 中,#[global_allocator]
属性现在是稳定的,这允许 Rust 程序将其分配器设置为系统分配器,并通过实现 GlobalAlloc
trait 来定义新的分配器。
在某些平台上,Rust 程序的默认分配器是 jemalloc。标准库现在提供了一个系统分配器的句柄,可以通过声明一个静态变量并用 #[global_allocator]
属性标记它,在需要时切换到系统分配器。
use std::alloc::System;
#[global_allocator]
static GLOBAL: System = System;
fn main() {
let mut v = Vec::new();
// This will allocate memory using the system allocator.
v.push(1);
}
然而,有时您希望为给定的应用程序域定义一个自定义分配器。通过实现 GlobalAlloc
trait,也可以相对容易地实现这一点。您可以在文档中阅读更多关于如何做到这一点的信息。
改进的格式化错误消息
诊断方面的工作仍在继续,这次重点是格式化
format!("{_foo}", _foo = 6usize);
以前,这里发出的错误消息相对较差
error: invalid format string: expected `'}'`, found `'_'`
|
2 | format!("{_foo}", _foo = 6usize);
| ^^^^^^^^
现在,我们会发出一个诊断,告诉您格式字符串无效的具体原因
error: invalid format string: invalid argument name `_foo`
|
2 | let _ = format!("{_foo}", _foo = 6usize);
| ^^^^ invalid argument name in format string
|
= note: argument names cannot start with an underscore
有关更多信息,请参阅详细的发行说明。
库的稳定化
我们已经提到了 GlobalAlloc
trait 的稳定化,但另一个重要的稳定化是 NonZero
数字类型。这些类型是标准无符号整数类型的包装器:NonZeroU8
、NonZeroU16
、NonZeroU32
、NonZeroU64
、NonZeroU128
和 NonZeroUsize
。
这允许进行大小优化,例如,Option<u8>
的大小为两个字节,但 Option<NonZeroU8>
的大小仅为一个字节。请注意,即使 NonZeroU8
被包装在另一个结构体中,这种优化仍然有效;下面的示例说明了尽管 Door
被放置在 Option
中,但其大小仍然为 1 个字节。这种优化也适用于用户定义的枚举:Option
并非特殊。
use std::mem;
use std::num::NonZeroU8;
struct Key(NonZeroU8);
struct Door {
key: Key,
}
fn main() {
assert_eq!(mem::size_of::<Door>(), 1);
assert_eq!(mem::size_of::<Option<Door>>(), 1);
}
许多其他库也已稳定化:您可以查看更多详细的发行说明以获取完整详细信息。
Cargo 特性
Cargo 现在将不再允许您发布带有修改 src
目录的构建脚本的 crate。 crate 中的 src
目录应被视为不可变的。
1.28.0 的贡献者
许多人齐心协力创建了 Rust 1.28。没有大家,我们不可能做到这一点。谢谢!