Rust 1.28 发布

2018 年 8 月 2 日 · Rust 核心团队

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 特性来定义新的分配器。

某些平台上 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 特性,这也很容易做到。您可以在 文档 中了解更多关于如何做到这一点的信息。

改进的格式错误消息

诊断工作仍在继续,这次重点是格式化。

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 特性的稳定化,但另一个重要的稳定化是 NonZero 数字类型。这些是标准无符号整数类型的包装器:NonZeroU8NonZeroU16NonZeroU32NonZeroU64NonZeroU128NonZeroUsize

这允许进行大小优化,例如,Option<u8> 是 2 字节大小,但 Option<NonZeroU8> 仅为 1 字节大小。请注意,即使 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 目录的构建脚本的板条箱。 板条箱中的 src 目录应被视为不可变的。

1.28.0 的贡献者

许多人共同创建了 Rust 1.28。没有你们,我们无法做到。 感谢!