Rust 1.29 发布公告

2018 年 9 月 13 日 · Rust 核心团队

Rust 团队很高兴宣布 Rust 的新版本 1.29.0。Rust 是一种系统编程语言,专注于安全、速度和并发。

如果您之前通过 rustup 安装了 Rust,获取 Rust 1.29.0 非常简单:

$ rustup update stable

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

1.29.0 稳定版中的新内容

1.29 版本相对较小;Rust 1.30 和 1.31 将包含大量内容,因此 1.29 周期的大部分时间都花在了为这些版本做准备。此版本中最重要的两项内容甚至不是语言特性:它们是 Cargo 新增的功能,而且都与 lint 相关。

  • cargo fix 可以自动修复包含警告的代码
  • cargo clippy 包含大量 lint,用于捕获常见错误并改进您的 Rust 代码

cargo fix

随着 Rust 1.29 的发布,Cargo 新增了一个子命令:cargo fix。如果您之前编写过 Rust 代码,您可能已经遇到过编译器警告。例如,考虑以下代码:

fn do_something() {}

fn main() {
    for i in 0..100 {
        do_something();
    }
}

在这里,我们调用了 do_something 一百次。但是我们从未使用过变量 i。因此 Rust 会发出警告:

$ cargo build
   Compiling myprogram v0.1.0 (file:///path/to/myprogram)
warning: unused variable: `i`
 --> src\main.rs:4:9
  |
4 |     for i in 1..100 {
  |         ^ help: consider using `_i` instead
  |
  = note: #[warn(unused_variables)] on by default

    Finished dev [unoptimized + debuginfo] target(s) in 0.50s

您看到它建议我们使用 _i 作为名称了吗?我们可以使用 cargo fix 自动应用此建议:

$ cargo fix
    Checking myprogram v0.1.0 (file:///C:/Users/steve/tmp/fix)
      Fixing src\main.rs (1 fix)
    Finished dev [unoptimized + debuginfo] target(s) in 0.59s

如果我们再次查看 src\main.rs,我们会发现代码已经改变了:

fn do_something() {}

fn main() {
    for _i in 0..100 {
        do_something();
    }
}

我们现在使用 _i,警告将不再出现。

cargo fix 的初始版本只修复了少量警告。编译器为此提供了一个 API,它只建议修复我们确信可以推荐正确代码的 lint。随着时间的推移,随着我们的建议改进,我们将扩展此功能以自动修复更多警告。

如果您发现编译器建议并希望帮助使其可修复,请在 此问题 上留下评论。

cargo clippy

说到警告,您现在可以通过 Rustup 预览 cargo clippy。Clippy 是大量额外的警告,您可以针对您的 Rust 代码运行它们。

例如:

let mut lock_guard = mutex.lock();

std::mem::drop(&lock_guard)

operation_that_requires_mutex_to_be_unlocked();

此代码在语法上是正确的,但可能存在死锁!您会看到,我们丢弃了lock_guard 的引用,而不是 guard 本身。丢弃引用是一个空操作,因此这几乎肯定是一个错误。

我们可以从 Rustup 获取 Clippy 的预览版:

$ rustup component add clippy-preview

然后运行它:

$ cargo clippy
error: calls to `std::mem::drop` with a reference instead of an owned value. Dropping a reference does nothing.
 --> src\main.rs:5:5
  |
5 |     std::mem::drop(&lock_guard);
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: #[deny(drop_ref)] on by default
note: argument has type &std::result::Result<std::sync::MutexGuard<'_, i32>, std::sync::PoisonError<std::sync::MutexGuard<'_, i32>>>
 --> src\main.rs:5:20
  |
5 |     std::mem::drop(&lock_guard);
  |                    ^^^^^^^^^^^
  = help: for further information visit https://rust-lang-nursery.github.io/rust-clippy/v0.0.212/index.html#drop_ref

正如您从帮助消息中看到的那样,您可以在网上查看 clippy 提供的所有 lint。

请注意,这是一个预览版;clippy 尚未达到 1.0。因此,它的 lint 可能会有所改变。我们将发布一个 clippy 组件,一旦它稳定下来;请试用预览版并告诉我们您的感受。

哦,还有一件事:您还不能将 clippy 与 cargo-fix 一起使用。它正在开发中!

有关更多信息,请参阅 详细的发布说明

库稳定化

此版本稳定了三个 API:

此外,您现在可以 比较 &strOsString

有关更多信息,请参阅 详细的发布说明

Cargo 特性

我们上面介绍了 Cargo 的两个新子命令,但此外,Cargo 现在将尝试修复因 git merge 而损坏的 lockfile。您可以传递 --locked 来禁用此行为。

cargo doc 也新增了一个标志:--document-private-items。默认情况下,cargo doc 只记录公共内容,因为它生成的文档是为最终用户准备的。但如果您正在开发自己的 crate,并且您有供自己参考的内部文档,--document-private-items 将为所有项目生成文档,而不仅仅是公共项目。

有关更多信息,请参阅 详细的发布说明

1.29.0 的贡献者

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