【Rust学习】01_入门基础
前言
让我们开始您的 Rust 之旅吧!有很多东西要学,但每一段旅程都是从第一步开始的,在本章中,我们将一起来学习以下知识点:
- 在 Linux、macOS 和 Windows 上安装 Rust
- 编写打印程序 Hello, world!
- 使用 cargo Rust 的包管理器和构建系统
内容
编辑器
工欲善其事必先利其器,我们需要一个编辑器,这里推荐使用RustRover,当然您可以可以使用vscode,不过需要安装下相应的插件去支持。
- 如果您没有安装过JetBrains Toolbox,可以点击访问 JetBrains Toolbox,然后再安装RustRover。
- 当然您也可以直接安装RustRover,点击 RustRover,选择您系统对应的版本下载即可。
安装Rustup
第一步是安装 Rust。我们将通过 rustup 以下方式下载 Rust,这是一个用于管理 Rust 版本和相关工具的命令行工具。您需要互联网连接才能下载。
您可以访问 Rust,他会给您推荐安装方式,当然您也可以访问 other-installation-methods自行下载安装。
安装
下面我们一起来学习下在各个系统中的rustup安装的步骤,详细的rustup介绍,可访问文档rustup查阅。
- 在 Linux 或 macOS 上安装 rustup
如果您使用的是 Linux 或 macOS,请打开终端并输入以下命令:
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
该命令下载脚本并开始安装该 rustup 工具,该工具将安装最新的稳定版本的 Rust。系统可能会提示您输入密码。如果安装成功,将出现以下行:
Rust is installed now. Great!
您还需要一个链接器,这是 Rust 用来将其编译输出合并到一个文件中的程序。您可能已经有一个。如果遇到链接器错误,则应安装 C 编译器,该编译器通常包含链接器。C 编译器也很有用,因为一些常见的 Rust 包依赖于 C 代码,需要 C 编译器。
在 macOS 上,您可以通过运行以下命令来获取 C 编译器:
$ xcode-select --install
Linux 用户通常应该根据其发行版的文档安装 GCC 或 Clang。例如,如果您使用 Ubuntu,则可以安装该 build-essential 软件包。
- 在 Windows 上安装 rustup
在 Windows 上,转到 rust 并按照说明安装 Rust。在安装过程中的某个时间点,系统将提示您安装 Visual Studio。这提供了编译程序所需的链接器和本机库。如果在此步骤中需要更多帮助,请参阅 windows-msvc
检测
现在我们来检查是否正确安装了 Rust,请打开一个 shell 并输入以下行:
$ rustc --version
如果正确的安装,那么您应该看到已发布的最新稳定版本的版本号、提交哈希和提交日期,格式如下:
# rustc x.y.z (abcabcabc yyyy-mm-dd)
rustc 1.79.0 (129f3b996 2024-06-10)
如果您看到此信息,则表示您已成功安装 Rust!如果您没有看到此信息,请检查 Rust 是否在您的 %PATH% 系统变量中,如下所示
在 Windows CMD 中,使用:
> echo %PATH%
在 PowerShell 中,使用:
> echo $env:Path
在 Linux 和 macOS 中,使用:
$ echo $PATH
如果这一切都是正确的,并且 Rust 仍然无法正常工作,那么您可以提交issue或者到Rust 社区寻求帮助。
更新和卸载
一旦 Rust 通过 rustup 安装,更新到新发布的版本就很容易了。在 shell 中,运行以下更新脚本:
$ rustup update
要卸载 Rust 和 rustup ,请从 shell 运行以下卸载脚本:
$ rustup self uninstall
本地文档
Rust 的安装还包括文档的本地副本,以便您可以离线阅读。运行 rustup doc
以在浏览器中打开本地文档。
每当标准库提供类型或函数时,您不确定它的作用或如何使用它,请使用应用程序编程接口 (API) 文档来了解!
Hello, World!
这里建议跟着下面的步骤一起来操作下,当然你也可以直接使用RustRover直接搭建项目,那么你会发现他已经给您创建好了Hello, world!
现在您已经安装了 Rust,是时候编写您的第一个 Rust 程序了。在学习一门新语言时,编写一个小程序将文本 Hello, world!
打印到屏幕上是传统的,所以我们在这里也会这样做!
创建项目目录
接下来我们创建一个项目目录,并将所有项目都保存在那里,记录我们学习的过程。
打开终端,输入以下命令,在项目目录下创建项目目录和“Hello, world!”项目目录。
对于 Windows 上的 Linux、macOS 和 PowerShell,请输入以下内容:
$ mkdir -p ~/Documents/project/rust-learn
$ cd ~/Documents/project/rust-learn
$ mkdir hello_world
$ cd hello_world
编写并运行程序
接下来,创建一个新的源文件并将其命名为 main.rs。Rust 文件始终以 .rs 扩展名结尾。如果文件名中使用了多个单词,则约定使用下划线来分隔它们。例如,使用 hello_world.rs 而不是 helloworld.rs。
现在打开您刚刚创建的 main.rs 文件,并输入以下代码:
fn main() {
println!("Hello, world!");
}
打开终端,在 Linux 或 macOS 上,输入以下命令以编译并运行文件:
$ rustc main.rs
$ ./main
Hello, world!
在 Windows 上,输入命令 .\main.exe
而不是 ./main
:
> rustc main.rs
> .\main.exe
Hello, world!
如果 Hello, world!
打印了,恭喜!您已经正式编写了一个 Rust 程序。这使您成为一名 Rust 程序员——欢迎!
解析Rust程序
fn main() {
}
这些代码定义了一个名为 main
的函数。该 main
函数很特别:它始终是每个可执行 Rust 程序中运行的第一个代码。在这里,第一行声明一个名为 main
,没有参数且不返回任何内容的函数。如果有参数,它们将进入括号 ()
内。
函数体包装在 {}
中。Rust 要求所有函数体周围都用大括号括起来。将左大括号放在与函数声明相同的行上,并在两者之间添加一个空格,这是一种很好的样式。
注意:如果您想在 Rust 项目中坚持使用标准样式,您可以使用一个自动rustfmt
格式化工具,以特定样式格式化您的代码(更多内容rustfmt
见附录 D)。Rust 团队已将此工具按rustc
原样包含在标准 Rust 发行版中,因此它应该已经安装在您的计算机上!
main
函数的主体包含以下代码:
println!("Hello, world!");
这行代码完成了这个程序中的所有工作:它将文本打印到屏幕上。这里有四个重要的细节需要注意。
- Rust 风格是用四个空格缩进,而不是一个制表符。
println!
调用 Rust 宏。如果它调用了一个函数,它将被输入为println
(不带!
)。我们将在第 19 章中更详细地讨论 Rust 宏。现在,您只需要知道,使用一个!
意味着您调用了一个宏而不是一个普通函数,并且宏并不总是遵循与函数相同的规则。- 您看到
"Hello, world!"
字符串。我们将此字符串作为参数传递给println!
,并将该字符串打印到屏幕上。 - 我们用分号 (
;
) 结束该行,表示此表达式已结束,下一个表达式已准备好开始。大多数 Rust 代码行都以分号结尾。
编译和运行
您刚刚运行了一个新创建的程序,因此让我们检查该过程中的每个步骤。
在运行 Rust 程序之前,您必须使用 Rust 编译器对其进行编译, rustc
方法是输入命令并向其传递源文件的名称,如下所示:
$ rustc main.rs
如果您具有 C 或 C++ 背景,您会注意到这类似于 gcc
或 clang
。编译成功后,Rust 会输出一个二进制可执行文件。
在 Windows上的 Linux、macOS 和 PowerShell 上,可以通过在 shell 中输入 ls
命令来查看可执行文件:
$ ls
main main.rs
在 Linux 和 macOS 上,您会看到两个文件。使用 Windows 上的 PowerShell,你将看到与使用 CMD 相同的三个文件。在 Windows 上使用 CMD,您将输入以下内容
> dir /B %= the /B option says to only show the file names =%
main.exe
main.pdb
main.rs
这将显示扩展名为 .rs 的源代码文件、可执行文件(在 Windows 上main.exe,但在所有其他平台上都是主要文件),以及在使用 Windows 时显示包含扩展名为 .pdb 的调试信息的文件。从这里,您可以运行主文件或main.exe文件,如下所示:
$ ./main # or .\main.exe on Windows
如果您的 main.rs 是“Hello, world!”程序,则此行将 Hello, world!
打印到您的终端。
如果您更熟悉动态语言(如 Ruby、Python 或 JavaScript),您可能不习惯将程序作为单独的步骤进行编译和运行。Rust 是一种提前编译的语言,这意味着您可以编译一个程序并将可执行文件提供给其他人,即使没有安装 Rust,他们也可以运行它。如果您给某人一个 .rb、.py 或 .js 文件,他们需要分别安装 Ruby、Python 或 JavaScript 实现。但在这些语言中,你只需要一个命令来编译和运行你的程序。在语言设计中,一切都是权衡取舍。
对于简单的程序来说,只需编译就可以 rustc
了,但随着项目的增长,您将需要管理所有选项并轻松共享代码。接下来,我们将向您介绍 Cargo 工具,它将帮助您编写真实世界的 Rust 程序。
Cargo
Cargo 是 Rust 的构建系统和包管理器。大多数 Rustaceans (锈粉)使用此工具来管理他们的 Rust 项目,因为 Cargo 会为您处理很多任务,例如构建代码、下载代码所依赖的库以及构建这些库。我们将代码需要的库称为依赖项。
最简单的 Rust 程序,就像我们目前编写的程序一样,没有任何依赖关系。如果我们使用 Cargo 构建了“Hello, world!”项目,它只会使用 Cargo 中处理代码构建的部分。当你编写更复杂的 Rust 程序时,你会添加依赖项,如果你使用 Cargo 启动一个项目,添加依赖项会容易得多。
因为绝大多数 Rust 项目都使用 Cargo,所以本书的其余部分假设你也在使用 Cargo。如果您使用了“安装”部分中讨论的官方安装程序,则 Cargo 随 Rust 一起安装。如果您通过其他方式安装了 Rust,请在终端中输入以下内容来检查是否安装了 Cargo:
$ cargo --version
如果您看到版本号,则表示已经安装了cargo!如果您看到错误,例如 command not found
,请查看安装方法的文档,尝试重新安装rust。
使用 Cargo 创建项目
让我们使用 Cargo 创建一个新项目,看看它与我们原来的 “Hello, world!” 项目有何不同。导航回您的项目目录(或您决定存储代码的任何位置)。然后,在任何操作系统上,运行以下命令:
$ cargo new hello_cargo
$ cd hello_cargo
第一个命令创建一个名为 hello_cargo 的新目录和项目。我们将项目命名为 hello_cargo,Cargo 在同名目录中创建其文件。
进入 hello_cargo 目录并列出文件。您将看到 Cargo 为我们生成了两个文件和一个目录:一个 Cargo.toml 文件和一个包含 main.rs 文件的 src 目录。
hello_cargo
├── Cargo.toml
└── src
└── main.rs
它还初始化了一个新的 Git 存储库以及一个 .gitignore 文件。如果在现有 Git 存储库中运行 cargo new
,则不会生成 Git 文件;可以使用 cargo new --vcs=git
来覆盖此行为。
在编辑器中打开 Cargo.toml,内容如下:
[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"
[dependencies]
cargo清单格式更多详细信息,请访问 cargo_manifest 查看
此文件采用 TOML (Tom's Obvious, Minimal Language) 格式,这是 Cargo 的配置格式。
[package] — 定义包。
name — 包的名称。
version — 包的版本。
authors — 软件包的作者。
edition — Rust版本
[dependencies] — 包库依赖项
接下来我们打开main.rs
,你会发现Cargo 为您生成了一个“Hello, world!”程序,就像我们在Hello,World!
中编写的一样!到目前为止,我们的项目和 Cargo 生成的项目之间的区别在于,Cargo 将代码放在了 src 目录下,而我们在顶部目录下有一个 Cargo.toml 配置文件。
Cargo 希望您的源文件位于 src 目录中。顶级项目目录仅用于 README 文件、许可证信息、配置文件以及与代码无关的任何其他内容。使用 Cargo 可帮助您组织项目。一切都有一个地方,一切都在它的位置上。
如果你启动了一个不使用 Cargo 的项目,就像我们在“Hello, world!”项目中所做的那样,你可以将其转换为一个使用 Cargo 的项目。将项目代码移动到 src 目录中,并创建相应的 Cargo.toml 文件。
运行项目
现在让我们看看当我们使用 Cargo 构建和运行“Hello, world!”程序时有什么不同!在 hello_cargo 目录中,输入以下命令生成项目:
$ cargo build
Compiling hello_cargo v0.1.0 (/Users/wangyang/Documents/project/rust-learn/hello_cargo)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 4.21s
此命令在 target/debug/hello_cargo(或 Windows 上的 target\debug\hello_cargo.exe)中创建可执行文件,而不是在当前目录中创建可执行文件。由于默认版本是调试版本,因此 Cargo 将二进制文件放在名为 debug 的目录中。您可以使用以下命令运行可执行文件:
$ ./target/debug/hello_cargo # or .\target\debug\hello_cargo.exe on Windows
Hello, world!
如果一切顺利, Hello, world!
应打印到终端。首次运行 cargo build
还会导致 Cargo 在顶层创建一个新文件:Cargo.lock。此文件跟踪项目中依赖项的确切版本。此项目没有依赖项,因此文件有点稀疏。您永远不需要手动更改此文件,Cargo 为您管理其内容。
我们只是构建 cargo build
了一个项目并用 运行 ./target/debug/hello_cargo
它,但我们也可以用来 cargo run
编译代码,然后在一个命令中运行生成的可执行文件:
$ cargo run
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.00s
Running `target/debug/hello_cargo` cap_mkdb cargo cargo-fmt case
Hello, world!
使用 cargo run
比必须记住运行 cargo build
然后使用二进制文件的整个路径更方便,因此大多数开发人员使用 cargo run
。
请注意,这次我们没有看到指示 Cargo 正在编译 hello_cargo
的输出。Cargo 发现文件没有更改,因此它没有重建,而只是运行二进制文件。如果你修改了源代码,Cargo 会在运行项目之前重新生成项目,你会看到以下输出:
$ cargo run
Compiling hello_cargo v0.1.0 (/Users/wangyang/Documents/project/rust-learn/hello_cargo)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.08s
Running `target/debug/hello_cargo`
Hello, world!
Cargo 还提供了一个名为 cargo check
,此命令快速检查代码,以确保它已编译,但不会生成可执行文件:
$ cargo check
Checking hello_cargo v0.1.0 (/Users/wangyang/Documents/project/rust-learn/hello_cargo)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.03s
为什么你不想要可执行文件?通常, cargo check
比 cargo build
因为它跳过生成可执行文件的步骤要快得多。如果你在编写代码时不断检查你的工作,使用 cargo check
将加快让你知道你的项目是否仍在编译的过程!因此,许多 Rustaceans 在编写程序时会定期运行 cargo check
以确保其编译。然后,当它们准备好使用可执行文件时,它们会运行 cargo build
。
让我们回顾一下到目前为止我们对 Cargo 的了解:
- 我们可以使用
cargo new
创建一个项目 - 我们可以使用
cargo build
编译一个项目 - 我们可以一步到位地构建
cargo run
和运行一个项目 - 我们可以在不生成二进制文件的情况下构建一个项目来检查错误
cargo check
- Cargo 没有将构建结果保存在与代码相同的目录中,而是将其存储在 target/debug 目录中
使用 Cargo 的另一个优点是,无论您在哪个操作系统上工作,命令都是相同的。
发布生产
当您的项目最终准备好发布时,您可以使用 cargo build --release
它进行优化编译。此命令将在 target/release 而不是 target/debug 中创建可执行文件。这些优化使你的 Rust 代码运行得更快,但打开它们会延长你的程序编译所需的时间。这就是为什么有两种不同的配置文件:一种用于开发,当您想要快速且频繁地重建时,另一种用于构建您将提供给用户的最终程序,该程序不会重复重建,并且会尽可能快地运行。如果要对代码的运行时间进行基准测试,请确保使用目标/版本中的可执行文件运行 cargo build --release
和基准测试。
对于简单的项目,Cargo 不会提供比仅使用 rustc
更多的价值,但随着您的程序变得更加复杂,它将证明其价值。一旦程序增长到多个文件或需要依赖项,让 Cargo 协调构建就容易得多,有关 Cargo 的更多信息,请查看其文档 cargo。
总结
您的 Rust 之旅已经有了一个良好的开端!在本章中,你已了解如何:
- 使用
rustup
- 更新 Rust 版本
- 打开本地安装的文档
- 直接使用
rustc
编写并运行“Hello, world!”程序 - 使用 Cargo 创建并运行新项目
现在是构建一个更实质性的程序来习惯于阅读和编写 Rust 代码的好时机。因此,在下一节的学习中,我们将构建一个猜谜游戏程序。