Rust 团队很高兴地宣布新版本 Rust 1.29.0 发布。Rust 是一门专注于安全性、速度和并发性的系统编程语言。
如果你之前通过 rustup 安装了旧版本的 Rust,升级到 Rust 1.29.0 非常简单,只需运行
如果你尚未安装 rustup,可以从我们网站的相应页面获取 rustup,并在 GitHub 上查阅 1.29.0 的详细发布说明。
1.29.0 stable 版本有什么新内容
1.29 版本相对较小;Rust 1.30 和 1.31 将包含大量内容,因此 1.29 周期的很多时间都花在了为这些版本做准备上。这个版本中最重要的两项内容甚至不是语言特性:它们是 Cargo 新增的功能,并且都与 lints 相关。
cargo fix可以自动修复带有警告的代码cargo clippy是一系列 lints,用于捕获常见错误并改进你的 Rust 代码
cargo fix
随着 Rust 1.29 的发布,Cargo 有了一个新的子命令:cargo fix。如果你以前写过 Rust 代码,可能见过编译器警告。例如,考虑这段代码
这里,我们调用 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,会发现代码已经改变
我们现在使用了 _i,警告将不再出现。
cargo fix 的初始版本只能修复少量警告。编译器提供了相应的 API,它只建议修复那些我们确信推荐正确代码的 lints。随着时间的推移和我们的建议不断改进,我们将扩展此功能以自动修复更多警告。
如果你发现了编译器建议并想帮助使其可修复,请在此 issue 上留言。
cargo clippy
说到警告,你现在可以通过 Rustup 试用 cargo clippy 的预览版。Clippy 提供了大量额外的警告,你可以用它们来检查你的 Rust 代码。
例如
let mut lock_guard = mutex.lock;
drop
operation_that_requires_mutex_to_be_unlocked;
这段代码语法上是正确的,但可能会导致死锁!你看,我们丢弃的是对 lock_guard 的引用,而不是 guard 本身。丢弃引用是一个无操作(no-op),所以这几乎肯定是个 bug。
我们可以从 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 提供的所有 lints。
请注意,这是一个预览版;clippy 尚未达到 1.0 版本。因此,其 lints 可能会发生变化。我们将在 clippy 稳定后发布组件;请试用预览版并告诉我们体验如何。
哦,还有一件事:目前还不能真正将 clippy 与 cargo-fix 一起使用。这项工作正在进行中!
有关更多信息,请参阅详细发布说明。
库稳定
本次发布稳定了三个 API
此外,你现在可以比较 &str 和 OsString。
有关更多信息,请参阅详细发布说明。
Cargo 特性
上面我们介绍了 Cargo 的两个新子命令,此外,Cargo 现在还会尝试修复因 git merge 而损坏的 lockfiles。你可以传递 --locked 参数来禁用此行为。
cargo doc 也新增了一个标志:--document-private-items。默认情况下,cargo doc 只生成公共项的文档,因为其产生的文档是面向最终用户的。但如果你正在开发自己的 crate,并且有一些内部文档供自己参考,则 --document-private-items 会为所有项生成文档,而不仅仅是公共项。
有关更多信息,请参阅详细发布说明。
1.29.0 贡献者
许多人共同努力创建了 Rust 1.29。没有大家的贡献,这是不可能完成的。谢谢!