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:
此外,您现在可以 比较 &str
和 OsString
。
有关更多信息,请参阅 详细的发布说明。
Cargo 特性
我们上面介绍了 Cargo 的两个新子命令,但此外,Cargo 现在将尝试修复因 git merge
而损坏的 lockfile。您可以传递 --locked
来禁用此行为。
cargo doc
也新增了一个标志:--document-private-items
。默认情况下,cargo doc
只记录公共内容,因为它生成的文档是为最终用户准备的。但如果您正在开发自己的 crate,并且您有供自己参考的内部文档,--document-private-items
将为所有项目生成文档,而不仅仅是公共项目。
有关更多信息,请参阅 详细的发布说明。
1.29.0 的贡献者
许多人共同创建了 Rust 1.29。没有你们,我们无法做到。 感谢!