Rust 团队很高兴地宣布 Rust 的新版本 1.29.0。Rust 是一种专注于安全性、速度和并发性的系统编程语言。
如果您之前通过 rustup 安装了 Rust,那么获取 Rust 1.29.0 非常简单,只需运行以下命令:
$ rustup update stable
如果您还没有安装 rustup,您可以从我们网站的相应页面获取 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 本身。删除引用是空操作,因此这几乎可以肯定是一个 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 提供的所有 lint。
请注意,这是一个预览版;clippy 尚未达到 1.0。因此,它的 lint 可能会发生变化。一旦它稳定下来,我们将发布一个 clippy
组件;请尝试一下预览版,并告诉我们它的效果如何。
哦,还有一件事:你还不能真正将 clippy 与 cargo-fix
一起使用。这正在开发中!
有关更多信息,请参阅详细的发布说明。
库的稳定化
此版本稳定了三个 API:
此外,您现在可以比较 &str
和 OsString
。
有关更多信息,请参阅详细的发布说明。
Cargo 功能
我们在上面介绍了 Cargo 的两个新子命令,此外,Cargo 现在将尝试修复被 git merge
损坏的锁文件。您可以传递 --locked
来禁用此行为。
cargo doc
还增加了一个新的标志:--document-private-items
。默认情况下,cargo doc
仅记录公共内容,因为它生成的文档是为最终用户准备的。但是,如果您正在处理自己的 crate,并且有内部文档供自己参考,则 --document-private-items
将为所有项生成文档,而不仅仅是公共项。
有关更多信息,请参阅详细的发布说明。
1.29.0 的贡献者
许多人齐心协力创建了 Rust 1.29。没有你们,我们不可能做到这一点。谢谢!