本篇是对 知名Rust视频博主Let's Get Rusty
的5 Better ways to code in Rust这一视频的翻译与整理, 过程中为符合中文惯用表达有适当删改, 版权归原作者所有.
大家好,在此我将向你展示5种改善Rust编码体验的方法。无论你是完全的初学者还是有经验的Rust开发者,这些技巧对你都很有价值。在视频结束时,我还会分享第六个颇具争议的额外技巧,所以请务必坚持到最后。
好,让我们开始吧。
完美的IDE设置
假设你已经安装了Rust,接下来你要做的是确保正确设置你的IDE。VS Code是我的首选,因为它易于使用,适用于所有主要操作系统,而且高度可配置。要为Rust开发配置VS Code,有三个必备扩展和一些可选但非常强大的扩展,我强烈推荐。
以下是三个必备扩展:
- Rust Analyzer: Rust的官方语言服务器,提供代码补全、跳转到定义、内联提示等功能。
- CodeLLDB: 这个扩展允许你调试Rust代码。
- Better TOML: 为TOML文件提供语法高亮。
有了这三个扩展,就可以开始Rust开发了。此外,还有一些非常强大的可选扩展,也值得安装:
- Error Lens: 改善错误和警告的高亮显示。如你所见,它会使错误更突出,并内联显示错误信息。
- Todo Tree: 帮助你快速找到代码中的待办事项。Todo Tree的一个很酷的特点是,它使用正则表达式匹配待办事项,你可以更改这个正则表达式。在这个例子中,我更改了正则表达式,使它也高亮显示todo!宏。
- crates: 允许你在Cargo.toml文件中轻松检查依赖项是否过时。如果依赖项过时,你会看到一个红色的X,后面跟着该依赖项的最新版本。
自动linting和formating / 实现实时重载 / 设置持续集成
接下来,让我们讨论如何设置你的Rust项目。具体来说,我将介绍如何配置自动代码检查和格式化, 实时重载,以及设置持续集成。
自动linting和formating
当你安装Rust工具链时,它附带了两个非常有用的工具:clippy和rustfmt。clippy是一个可配置的代码检查工具,可以捕捉常见错误并改进你的Rust代码。rustfmt是一个可配置的工具,用于按照样式指南格式化Rust代码。你可以在终端中手动运行这些工具,但我喜欢将它们配置为自动运行。让我们看看如何在VS Code中做到这一点。
要配置clippy自动运行,在VS Code中打开设置,在搜索栏中输入"rust-analyzer check",然后向下滚动直到看到check命令,将"check"改为"clippy"。现在,如果我们打开main.rs,你可以看到我们得到了一个警告,因为我们使用了clippy不允许的变量名。
要配置rustfmt自动运行,我们回到设置并切换到JSON文件配置。然后你只需要这两个配置:确保默认格式化程序是Rust Analyzer,并且保存时格式化设置为true。然后,如果我们回到main.rs并更改代码格式,它会在我们保存文件时被修复。
借助cargo-watch实现实时重载
接下来,让我们讨论如何使用cargo-watch
实现实时重载。cargo-watch是一个Cargo插件,它监视项目源文件的变化,并在发生变化时运行Cargo命令。
要安装cargo-watch,运行cargo add cargo-watch
。
然后你可以运行cargo-watch。这是我喜欢运行的特定命令:
cargo watch -q -c -w src -x 'run -q'
- -q表示安静模式,它会抑制cargo-watch的输出。
- -c会清除屏幕。
- -w允许我们指定要监视的文件和文件夹,在这个例子中只监视src目录。
- -x允许我们指定要执行的Cargo命令,在这个例子中我们执行
cargo run
并使用-q选项,这将阻止Cargo日志消息被打印。
如果我们执行这个命令,程序将被运行,然后如果我们更改代码,它将被重新编译。
使用GitHub Actions设置持续集成
最后,让我们讨论如何使用GitHub Actions设置持续集成。
要为我们的项目设置持续集成,我们只需要创建一个.github文件夹,其中包含一个workflows文件夹,后者包含了定义我们工作流程的YAML文件。
这里有一个名为"Rust CI"的简单工作流程示例。它在每次代码变更被推送到main分支时,或者每次有针对main分支的pull request时运行。
这个工作流程有一个作业,包含几个步骤:
- 首先checkout我们的代码
- 然后安装cargo-audit,这将允许我们审计代码库中的漏洞
- 接着构建并测试代码
- 然后运行cargo clippy,如果出现任何警告则构建失败
- 最后运行cargo audit,如果我们的项目依赖项包含任何已知漏洞,构建将失败
有了自动代码检查和格式化、实时重载和持续集成,我们的项目现在已经正确设置,可以开始编码了。
Work->Right->Fast
下一个技巧是如何写Rust有关的方法论。
过度工程是软件开发中的一个常见问题,当你编写的代码比需要的更复杂或更精细时就会发生,这是你在编写Rust时绝对要避免的。
相反,你应该遵循"先使其工作,然后使其正确,最后使其快速"的原则。
首先,编写简单解决问题或完成目标的代码。不管它是否是最地道或最高性能的代码。然后,一旦你的代码工作了,你可以使它更加地道,最后使它更高性能。
让我们看一个例子:
这里我们有一个名为calculate_sum的函数,它接收一个整数数组并返回总和。代码可以工作,但它不是最地道的Rust代码。例如,在calculate_sum函数内,我们使用了for循环而不是迭代器适配器方法,在main函数内,我们对calculate_sum返回的Result类型使用了unwrap,而不是处理错误情况。
现在代码可以工作了,我们可以通过修复这些问题使它更加地道。在calculate_sum内,我们现在使用sum方法而不是for循环,在main函数内,我们对calculate_sum返回的Result类型进行匹配。代码现在更加地道了。
接下来,我们可以考虑性能。为了"挤出"更多性能,我们将使用rayon crate
引入并行性。所需要做的就是包含rayon的前导模块,然后在calculate_sum内调用par_iter而不是iter。par_iter代表并行迭代器。rayon将完成如何并行化我们程序的艰难工作。这就是为什么rayon是一个有用且非常流行的Rust crate。
Master key crates
说到Rust crates,下一个技巧是让自己熟悉一些最流行的第三方crates。这一点尤其重要,因为Rust以标准库小而闻名,所以当你编写任何有意义的项目时,很快就会开始使用第三方依赖。
你应该知道的关键crates包括:
- serde和serde_json: 用于序列化和反序列化你的数据类型
- thiserror和anyhow: 都用于错误处理
- tokio: 最流行的Rust异步运行时
还有很多其他重要的crates,在这个视频中没有时间一一介绍,但如果你想要一个精选的Rust crates列表, blessed.rs是一个很好的资源。
Rust特定的设计模式
现在你知道Rust编码的方法论, 以及应该知道一些常用第三方crates,下一个技巧是学习Rust特定的设计模式。例如,扩展trait模式,它允许你在定义类型的crate之外为类型添加方法。当你想扩展标准库中类型的功能时,扩展traits特别常见。
让我们看一个例子:
在一个crate内,假设我们定义了一个名为Palindrome的公共trait,它有一个返回布尔值的is_palindrome函数。然后我们为标准库中的String类型实现Palindrome trait。然后我们可以在另一个crate中导入这个trait,所有的String类型都将可以访问is_palindrome方法。如你所见,这个模式允许我们轻松扩展标准库中类型的功能。
你应该了解的其他一些设计模式包括:类型状态模式、内部可变性、RAII和建造者模式。如果你希望我制作一个视频详细介绍这些特定模式,请在评论区让我知道。
利用AI
现在让我们来到有争议的额外技巧。但在此之前,请确保通过访问letsgetrusty.com/cheatsheet获取你的免费Rust cheatsheet。
第六个额外技巧是利用AI。现在围绕AI有很多兴奋和恐慌,但无论你怎么想,它都已经来了,所以不妨熟悉它并利用它。就我个人而言,我认为AI是一个令人惊叹的工具,可以让你的工作效率大大提高。
例如,像GitHub Copilot这样的工具可以帮助你编写更地道的Rust代码,或帮助你快速实现重复或通用的代码。ChatGPT也是一个非常有用的工具,事实上,它编写了本视频前面提到的GitHub Actions工作流文件。所以,再次强调,确保你了解这些工具并利用它们。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。