Rust #1:创建你的开发环境
概述
这篇博客旨在记录我使用 Rust 的心得体会。我从事电子游戏程序员超过 25 年,因此一直将 C++ 作为我的主要编程语言,甚至用于个人项目。自从发现并学习 Rust 以来,我再也不会主动接触 C++ 了。我只会在日常工作中使用 C++,仅此而已。在我看来,Rust 已经让 C++ 在编写新软件方面变得多余。
在过去的几个月里,我成功地完善了我的 Rust 编程开发环境,并想分享我的方法。这就是我的第一篇文章的主题——如何搭建一个高效的 Rust 编程开发环境。
先决条件
我假设读者熟悉终端(或 Shell)。也就是说,他们知道如何通过终端创建文件夹、设置当前文件夹以及启动命令。
我还假设读者之前有过编程经验,可能是 C、C++ 或类似的语言。这些指南不会教你如何编程,而是如何将你现有的编程技能运用到一门新的语言中。
您还需要互联网连接。Rust 构建系统会不断从万维网下载软件包(称为 crate)。
安装 Rust
安装 Rust 的最佳方法是使用工具Rustup
。Windows 用户需要下载可执行文件,但对于具有更合理命令 shell 的操作系统,只需执行一次剪切和粘贴即可。
跳转到http://rustup.rs并按照说明操作。rustup-init.exe
在 Windows 上运行可执行文件,或在其他操作系统上执行 shell 命令后,您将看到一个全屏文本和 3 个选项:
继续选择选项 1,这样 Rust 及其相关工具就安装完成了。为了确认,请打开你常用的终端并输入:
$ rustc --version
如果一切顺利(我希望如此,因为否则本指南不会对您有帮助),您应该会看到类似以下内容:
rustc 1.53.0 (53cb7b09b 2021-06-17)
安装过程涉及rustup
下载和安装“组件”。您可能看到正在安装的组件包括:
- cargo - 终极、超强的打包/构建/执行一切操作的工具,将成为您 Rust 编程体验的中心。
- clippy - 这是一款 linting 工具,可以扫描你的代码并提出改进建议或发现问题。这是你工作流程中不可或缺的一部分。
- rust-docs - 一个 Cargo 插件,可以从源代码自动生成文档。如果你熟悉 Doxygen,它与它类似。
- rustc - 编译器,nuff 说!
- rustfmt - Rust 非常规范的代码格式化程序。它会根据一套标准自动格式化你的代码,以便每个人的 Rust 代码看起来都一样。一开始可能会有点烦人,但只要坚持使用,你就能从中受益。
你的第一个 Rust 程序
让我们尝试一下必备的 Hello World 程序。有了 Cargo,您无需输入任何代码即可完成!大多数指南会演示如何使用,rustc
但您无需直接操作。您将使用 Cargo 来检查、构建、测试、基准测试和运行代码以及执行许多其他操作。因此,请跳转到您最喜欢的终端,cd
进入您为 Rust 开发预留的文件夹(我使用 Windows,因此我选择的文件夹是r:\
),然后输入:
$ cargo new hello
$ cd hello
您将收到一条消息,告诉您已经创建了一个名为“hello”的二进制包。
让我们看看你刚刚创建的文件夹。首先,你会看到一个Cargo.toml
文件。它向 Cargo 提供了如何构建项目的信息以及其他元数据(例如作者、版本等)。我们稍后会介绍这一点。
其次,有一个与 相关的隐藏文件和目录git
,它是大多数 Rust 程序员使用的默认源代码控制系统。您可以将其切换到 Mercurial 或其他版本。要了解相关信息,请快速访问https://doc.rust-lang.org/cargo/commands/cargo-new.html并查看其--vcs
命令行选项。在本指南中,我将忽略该文件和文件夹。
最后,有一个src
文件夹,里面存放着你所有的 Rust 源代码。如果你查看里面的内容,你会看到一个名为 的文件main.rs
。让我们来查看一下。你可以使用type
Windows 系统或cat
其他操作系统来显示 的内容src/main.rs
:
fn main() {
println!("Hello, world!");
}
hello world 程序已经写好了,感谢 Cargo 的帮助。我们来看一下代码:
- fn标记一个函数的开始,在本例中定义了名为 的函数
main
。所有 Rust 应用程序都从此函数开始,就像 C/C++ 一样。如果您使用 Cargo 构建(我们将使用 Cargo),则文件main.rs
夹根src
目录中也必须有一个文件。它后面的括号通常包含参数(我们目前没有),该函数的代码位于大括号之间。如果您熟悉 C、C++、C#、JavaScript 等语言,那么您会对这一切感到熟悉。 - println!会将文本打印到标准输出。名称中的感叹号表示它
println!
不是一个函数,而是一个宏。它类似于 Lisp 中的宏,而不是那些无用的 C 风格宏。Rust 可以在编译期间生成代码。在本例中,println!
它将根据其参数扩展为多个语句,这些语句将插入到调用点。
好的,让我们运行它。输入:
$ cargo run
Compiling hello v0.1.0 (R:\hello)
Finished dev [unoptimized + debuginfo] target(s) in 1.11s
Running `target\debug\hello.exe`
Hello, world!
这将编译并运行代码。精明的你会注意到出现了一个名为 的新文件夹target
。深入挖掘,你会看到一个debug
文件夹。最后,你会在里面看到hello.exe
你刚刚构建的 ,以及刚刚运行的 Cargo。
事实上,‘Hello, world!’ 消息之前的编译器输出描述了您刚刚构建的应用程序的类型(未优化并包含调试信息)以及在哪里可以找到它。
我们也可以构建并运行一个优化的:
$ cargo run --release
Compiling hello v0.1.0 (R:\hello)
Finished release [optimized] target(s) in 0.66s
Running `target\release\hello.exe`
Hello, world!
以下是一些值得了解的其他 Cargo 命令:
cargo build
- 这只会构建最终的可执行文件。cargo run
如果需要,将会隐式调用它。cargo clean
- 这将删除该target
文件夹及其中生成的所有文件。cargo check
cargo build
- 在编写代码时很有用。这会编译你的代码,但不生成代码。这比你只想检查语法错误时快得多,而且很有用。由于我稍后会演示的 IDE 集成非常出色,所以很少需要这样做。
还有一点,在构建可执行文件后,Cargo.lock
还会出现一个文件。生成此文件是为了锁定您可能用于构建程序的其他软件包的版本。这允许 Rust 编译器在清理后重新创建完全相同的可执行文件。它确保下载、构建和链接到您的应用程序的软件包版本与之前相同。目前,我们不使用软件包,因此此文件包含的信息很少。如果您使用源代码管理(例如 Git),则应在提交时将此文件与Cargo.toml
您的源代码一起包含。
编辑
开始学习 Rust 的第二步是设置合适的编程环境,以最大限度地减少你和工作之间的摩擦。这个决定的关键在于使用哪种编辑器。我尝试过用 Emacs、Vim 和 Sublime 编写 Rust 代码,但最终选择的文本编辑器是Visual Studio Code
。对我来说,它是微软迄今为止最好的产品。
为什么选择 Visual Studio Code?在我看来,它拥有最成熟的 Rust 代码编写工具,以及与 Rust 生态系统和构建工具(例如 Cargo)交互的工具。
因此请前往https://code.visualstudio.com/并下载并安装它。
重新启动终端,然后输入:
$ code .
瞧瞧:
终端很好用,就是打字太麻烦了。难道我们写代码还不够吗?那就试试能不能用 Visual Studio Code(以下简称 VS Code)来构建。目前还不行,因为需要扩展。
VS Code 扩展
要将 VS Code 变成强大的 Rust 编辑器,我们需要安装一些扩展。点击左侧的第 5 个图标(它看起来像 4 个正方形,其中一个正方形偏移),即可打开扩展界面。使用搜索框查找下面列出的所需扩展,然后点击扩展条目旁边的蓝色“安装”按钮:
- rust-analyzer - 为 Rust 和许多其他与 Rust 相关的实用程序提供“智能感知”。
- C/C++ - 什么???你需要一个 C/C++ 扩展吗?是的,它包含调试器,可以用来插入断点和单步执行代码。你也可以使用,
CodeLLDB
但对我来说,这个C/C++
更快。
此外,还有一些有用的扩展需要安装,虽然没有必要,但仍然非常有用:
- 板条箱- 检查您引用的任何板条箱的版本(稍后会详细介绍)。
- Markdown All in One - 你将编写多个 Markdown 文件(带有
.md
扩展名的文件)。此扩展使编写过程更加轻松,并提供了实用的预览模式。 - 更好的 TOML - 一些编辑器支持编辑 TOML 文件,例如
Cargo.TOML
。 - Rewrap - 与 Rust 无关,但提供了重新格式化文本(在 Markdown 文件和 Rust 注释中)的功能,使其更适合行距。按下
Alt+Q
,您可以将几个长注释转换为几个适合屏幕大小的短注释。正如您最终将看到的,Rust 注释将在文档生成中发挥重要作用。
清空搜索框后,您将看到已安装的扩展程序。旁边的一些按钮可能会标有“需要重新加载”,如果出现此提示,请按下该按钮,几秒钟后即可重启 VS Code。
安装完成后rust-analyzer
,您将看到窗口右下角弹出一个对话框。如果您错过了,请点击notifications
窗口右下角的图标。它应该如下所示:
点击“立即下载”按钮。如果没有看到,请重启 VS Code,它应该会再次显示。这将下载 Rust 语言服务器 (RLS),这是一个外部程序,可以分析你的源代码并通过扩展程序与 VS Code 进行通信,以显示有关你的程序的有用信息,包括自动完成功能。
下载完成后,“rust-analyzer”将开始查看你的代码。src/main.rs
使用 VS Code 打开它,你会在函数上方看到两个新的链接main
:
点击Run
,VS Code 将构建并运行你的程序。你可以在自动打开的终端窗口中看到结果。
或者,您也可以点击Debug
执行相同的操作。但是目前 VS Code 尚未正确设置调试。
在 VS Code 中调试
如果您以前没有使用过 VS Code,它可能没有设置断点等调试功能。因此,请按Ctrl+Comma
打开 VS Code 的设置窗口。breakpoints
在此窗口顶部的搜索栏中输入以下内容,并确保Debug: Allow Breakpoints Everywhere
已选中:
在设置窗口中,重新输入搜索参数formatter
。确保Editor: Default Formatter
设置为rust-analyzer
并且Editor: Format On Save
已勾选。这样,rustfmt
前面提到的组件就能在您每次保存文件时发挥它的魔力。这真的是一个很棒的省时方法。您可以随意输入代码,但请记住,保存后所有内容都会移动到正确的位置,缺失的尾随逗号和空格也会被替换。
现在你已经完成了这些,你可以F9
在编辑时点击,在当前行添加断点。现在尝试在println!
中的语句上执行此操作src/main.rs
:
点击“调试”,代码会在执行前停在当前行。点击F10
跳过下一行,执行过程中会出现“Hello, world!”字样。点击F5
继续运行,或Shift+F5
完全停止调试。别忘了F9
再次点击断点所在的行,移除断点!
VS Code 中的启动器和任务
代码中的这些链接非常方便,但需要先打开src/main.rs
函数main
才能看到它们。如果我们可以按下一个键就能运行或构建它,那不是更好吗?
第一步是强制 VS Code 一键构建你的源代码。按下 键F1
即可调出命令面板,它是 VS Code 中的一个界面,包含所有你可以输入的命令。现在输入build
,命令菜单就会缩减为几个条目,其中之一是Tasks: Configure Default Build Task
。
选择它。将出现一个新菜单,其中包含可用的 Cargo 命令列表。我们要选择rust: cargo build
。这将在你的项目中创建一个新文件,位于.vscode/tasks.json
。此文件定义了一个 VS Code 可以运行的任务。它调用了cargo build
它,仅此而已。但让我们对其进行改进。
首先,将label
条目改短一些。你可以改成任何你想要的,但我通常改成build
。稍后其他文件会引用它。
其次,我们希望 VS Code 中的终端窗口在每次启动构建时都清空,以便我们能够清晰地区分当前消息和之前构建的消息。在行尾添加一个逗号label
,然后开始输入presentation
。输入几个字符后,你应该会看到一个智能感知窗口打开,提示presentation
。按下 ENTER 键,VS Code 就会自动完成输入。非常方便!现在将输入改为clear
,而true
不是false
。最终版本应该如下所示:
{
"version": "2.0.0",
"tasks": [
{
"type": "cargo",
"command": "build",
"problemMatcher": [
"$rustc"
],
"group": {
"kind": "build",
"isDefault": true
},
"label": "build",
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": true
}
}
]
}
现在,File > Preferences > Keyboard Shortcuts
从菜单中选择并build
在新键盘快捷键窗口的搜索栏中输入。
双击Keybinding
显示 的那一行下方的列Tasks: Run Build Task
。这将允许您将按键绑定到该命令。输入 ,然后F7
按ENTER
,即可完成。VS Code 会警告您其他绑定使用了相同的按键,但请忽略这些按键,因为它们不会冲突。我选择了 F7,因为这是 Visual Studio IDE 中用于构建的常用按键,我已经习惯了。当然,您可以选择任何其他适合您的组合键。
测试一下!现在按下 F7(或你选择的任何组合键),VS Code 中的终端窗口就会清空,并开始构建!
现在,我们想让它在按下一个键时就能构建,然后按下另一个键时就能运行(构建后)。VS Code 已经F5
为这个任务做好了准备,但目前还不知道如何操作。
点击 VS Code 左侧的第 4 个图标,它看起来像一个三角形,角上有一个虫子。点击后,你会看到一个带有大Run and Debug
按钮的新界面(但不要按它!)。
在该按钮下方,您应该会看到一个链接create a launch.json file
。要一键运行程序,我们需要创建一个启动器。启动器是通过此launch.json
文件配置的,因此请继续并点击该链接。您将看到一个对话框,要求您选择环境。
C++ (Windows)
如果您使用的是 Windows 系统并且使用了扩展名,请选择此C/C++
选项,否则选择C++ (GDB/LLDB)
其他选项。这将创建一个名为 的新文件.vscode/launch.json
。和之前一样,让我们做一些修改:
- 将该值更改
program
为${workspaceFolder}/target/debug/hello.exe
。这需要与你正在运行的最终可执行文件相匹配。 - 更改
console
值,使其读取integratedTerminal
并在末尾添加逗号。 console
在条目和添加逗号的原因之后,添加条目"preLaunchTask": "build"
。这一行引用了您在 中输入的标签文本tasks.json
。它们必须匹配。这一行告诉启动器确保首先运行构建任务。我们想要运行程序的最新版本,不是吗?
最终结果将是:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(Windows) Launch",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/target/debug/hello.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"preLaunchTask": "build"
}
]
}
按下F5
,启动器就会运行。你应该会在终端中看到构建消息以及程序的输出。
我偶尔会看到 VS Code 遇到这个问题。如果无法运行,请检查你的tasks.json
和launch.json
文件,然后cargo clean
在项目文件夹中的终端运行。
编译器错误
这篇博客现在有点长了,所以最后还有一件事要说。如果你的代码中出现错误,会发生什么?好消息是,rust-analyzer
扩展程序和 VS Code 会协同帮助你解决问题。让我们在代码中添加一个错误。在println!
语句之后,添加一个新的:
fn main() {
println!("Hello, world!");
foo();
}
然后点击“保存”(Ctrl+S
)。rust-analyzer
通常只有在保存后才能看到更改。现在错误出现在程序中,如果不构建多个程序,就会发生以下情况:
- 下方会出现一条红线
foo
。将鼠标指针移到红线上方,您将看到一个弹出窗口描述错误。 - 查看编辑窗口上方的选项卡,您会看到文件名已变为红色,后面跟着一个数字。(还有一个字母 U,但它与源代码控制有关,所以请忽略它)。这个数字表示错误数量。选项卡文本也可能变为黄色,这意味着有警告但没有错误。这次,数字表示警告数量。您可以一目了然地看到程序中有多少错误。
- 在窗口的滚动条上,你会看到一个小红色标记。这大致显示了错误的位置。
- 如果您的终端窗口仍在 VS Code 中打开,您将在
Problems
选项卡旁边看到一个数字。在此选项卡中,您将看到错误列表。单击它们即可跳转到出现错误的代码行。
哇,这么多线索表明你的程序出了问题。现在按下构建键来运行构建任务(记住我的是F7
)。在Terminal
下面的选项卡中,你会看到编译器的输出。它通常比其他地方的错误信息更清晰:
Rust 提供了史上最棒的错误信息!你甚至可以在终端输入rustc --explain E0765
,按照说明操作,更详细地解释上面的错误。真是太棒了!
概括
讲了这么多,确实有点费劲。不过我们安装了 Rust 及其相关工具,安装了 VS Code 并扩展了它以支持 Rust,然后演示了如何使用 VS Code 构建和运行程序。
第二部分将讨论借用检查器、所有权、生命周期以及所有这些精彩内容。到时候见!
鏂囩珷鏉ユ簮锛�https://dev.to/cthutu/rust-1-creating-your-development-environment-55bi