宣布 Rust 1.48.0

2020 年 11 月 19 日 · Rust 发布团队

Rust 团队很高兴宣布 Rust 的新版本 1.48.0。Rust 是一种编程语言,它赋予每个人构建可靠高效软件的能力。

如果您之前通过 rustup 安装了 Rust,获取 Rust 1.48.0 就像

$ rustup update stable

如果您还没有,您可以从我们网站上的相应页面 获取 rustup,并查看 GitHub 上的 1.48.0 的详细发布说明

1.48.0 稳定版中的内容

本版本的亮点是 Rustdoc,它进行了一些更改,使编写文档更加容易!查看 详细的发布说明,了解本文未涵盖的其他更改。

Rustdoc 中更轻松的链接

Rustdoc 是 Rust 发行版中包含的库文档工具,它允许您使用 Markdown 编写文档。这使得它非常易于使用,但也存在一些痛点。假设您正在为一些看起来像这样的 Rust 代码编写一些文档

pub mod foo {
    pub struct Foo;
}

pub mod bar {
    pub struct Bar;
}

我们有两个模块,每个模块中都有一个结构体。想象一下,我们想将这两个结构体一起使用;我们可能希望在文档中说明这一点。因此,我们会编写一些看起来像这样的文档

pub mod foo {
    /// Some docs for `Foo`
    ///
    /// You may want to use `Foo` with `Bar`.
    pub struct Foo;
}

pub mod bar {
    /// Some docs for `Bar`
    ///
    /// You may want to use `Bar` with `Foo`.
    pub struct Bar;
}

这很好,但如果我们可以链接到这些其他类型,那就更好了。这将使我们库的用户更容易在我们的文档中浏览它们。

这里的问题是 Markdown 不了解 Rust 以及 rustdoc 生成的 URL。因此,Rust 程序员必须手动编写这些链接

pub mod foo {
    /// Some docs for `Foo`
    ///
    /// You may want to use `Foo` with [`Bar`].
    ///
    /// [`Bar`]: ../bar/struct.Bar.html
    pub struct Foo;
}

pub mod bar {
    /// Some docs for `Bar`
    ///
    /// You may want to use `Bar` with [`Foo`].
    ///
    /// [`Foo`]: ../foo/struct.Foo.html
    pub struct Bar;
}

请注意,我们还必须使用相对链接,以便这在脱机状态下也能正常工作。这不仅过程繁琐且容易出错,而且在某些地方也完全错误。如果我们在 crate 根目录中放置一个 pub use bar::Bar,这将重新导出我们根目录中的 Bar。现在我们的链接就错了。但是,如果我们修复了它们,那么当我们导航到位于模块内部的 Bar 时,它们最终就会出错。您实际上无法手动编写这些链接,并使它们都保持准确。

在本版本中,您可以使用一些语法让 rustdoc 知道您正在尝试链接到一个类型,它将为您生成 URL。以下是基于我们之前代码的两个不同的示例

pub mod foo {
    /// Some docs for `Foo`
    ///
    /// You may want to use `Foo` with [`Bar`](crate::bar::Bar).
    pub struct Foo;
}

pub mod bar {
    /// Some docs for `Bar`
    ///
    /// You may want to use `Bar` with [`crate::foo::Foo`].
    pub struct Bar;
}

第一个示例将显示与之前相同的文本;但会生成指向 Bar 类型的正确链接。第二个将链接到 Foo,但会显示整个 crate::foo::Foo 作为链接文本。

这里有很多选项可以使用。请参阅 rustdoc 手册的 "按名称链接到项目" 部分了解更多信息。Inside Rust 上也有一篇关于 此功能历史 的文章,由该功能背后的部分贡献者撰写!

添加搜索别名

您现在可以在项目上指定 #[doc(alias = "<alias>")],以便在通过 rustdoc 的 UI 搜索时添加搜索别名。 这是一个较小的更改,但仍然很有用。它看起来像这样

#[doc(alias = "bar")]
struct Foo;

使用此注释,如果我们在 rustdoc 的搜索中搜索“bar”,Foo 将作为结果的一部分出现,即使我们的搜索文本中没有“Foo”。

别名的一个有趣的用例是 FFI 包装 crate,其中每个 Rust 函数都可以被别名为它包装的 C 函数。这样,底层 C 库的现有用户就可以轻松地搜索正确的 Rust 函数!

库更改

最重大的 API 更改有点拗口:[T; N]: TryFrom<Vec<T>> 现在已稳定。这意味着什么?好吧,您可以使用它来尝试将向量转换为给定长度的数组

use std::convert::TryInto;

let v1: Vec<u32> = vec![1, 2, 3];

// This will succeed; our vector has a length of three, we're trying to
// make an array of length three.
let a1: [u32; 3] = v1.try_into().expect("wrong length");

// But if we try to do it with a vector of length five...
let v2: Vec<u32> = vec![1, 2, 3, 4, 5];

// ... this will panic, since we have the wrong length.
let a2: [u32; 3] = v2.try_into().expect("wrong length");

在上一版本中,我们谈到了标准库能够使用 const generics。这是一个很好的例子,说明了我们可以使用这些功能添加的 API 类型。预计很快就会听到更多关于 const generics 稳定化的消息。

此外,本版本稳定了五个新的 API

以下先前稳定的 API 现在已变为 const

查看 详细的发布说明了解更多信息。

其他更改

Rust 1.48.0 版本中还有其他更改:查看 RustCargoClippy 中发生了哪些变化。

1.48.0 的贡献者

许多人共同创建了 Rust 1.48.0。没有你们,我们不可能做到。 感谢!