这里填写标题
1. Rust Hello World
1.1. 项目目录
需要创建一个存放 Rust 代码的目录。Rust 并不关心代码的存放位置, 我们建议你在 home
目录中创建 projects
目录, 并将你的所有项目存放在这里。
$ mkdir ~/projects
$ cd ~/projects
$ mkdir hello_world
$ cd hello_world
新建一个源文件, 命名为 main.rs
。Rust 源文件总是以 .rs
扩展名结尾。如果文件名包含多个单词, 那么按照命名习惯, 应当使用下划线来分隔单词。例如命名为 hello_world.rs
, 而不是 helloworld.rs
。
1.2. Hello World
文件名: main.rs
fn main() {
println!("Hello, world!");
}
$ rustc main.rs
$ ./main
Hello, world!
在 main
函数中有如下代码:
println!("Hello, world!");
这里有四个重要的细节需要注意。
- 首先 Rust 的缩进风格使用 4 个空格, 而不是 1 个制表符 (tab)。
- 第二,
println!
调用了一个 Rust 宏 (macro)。如果是调用函数, 则应输入println
(没有!
)。现在你只需记住, 当看到符号!
的时候, 就意味着调用的是宏而不是普通函数, 并且宏并不总是遵循与函数相同的规则。 - 第三, “Hello, world!” 是一个字符串。我们把这个字符串作为一个参数传递给
println!
, 字符串将被打印到屏幕上。 - 第四, 该行以分号结尾 (
;
), 这代表一个表达式的结束和下一个表达式的开始。大部分 Rust 代码行以分号结尾。
Rust 是一种 预编译静态类型 (ahead-of-time compiled) 语言, 这意味着你可以编译程序, 并将可执行文件送给其他人, 他们甚至不需要安装 Rust 就可以运行。如果你给他人一个 .rb
、.py
或 .js
文件, 他们需要先分别安装 Ruby, Python, JavaScript 实现(运行时环境, VM)。
仅仅使用 rustc
编译简单程序是没问题的, 不过随着项目的增长, 你可能需要管理你项目的方方面面, 并让代码易于分享。接下来, 我们要介绍一个叫做 Cargo 的工具, 它会帮助你编写真实世界中的 Rust 程序。
1.3. Hello, Cargo!
Cargo 是 Rust 的构建系统和包管理器。大多数 Rustacean 们使用 Cargo 来管理他们的 Rust 项目, 因为它可以为你处理很多任务, 比如构建代码、下载依赖库并编译这些库。(我们把代码所需要的库叫做 依赖(dependencies))。
可以在终端输入如下命令检查是否安装了 Cargo:
$ cargo --version
1.3.1. 使用 Cargo 创建项目
回到 projects
目录(或者你存放代码的目录)。
$ cargo new hello_cargo
$ cd hello_cargo
进入 hello_cargo
目录并列出文件。将会看到 Cargo 生成了两个文件和一个目录: 一个 Cargo.toml
文件, 一个 src
目录, 以及位于 src
目录中的 main.rs
文件。
这也会在 hello_cargo
目录初始化了一个 git 仓库, 以及一个 .gitignore
文件。如果在一个已经存在的 git 仓库中运行 cargo new
, 则这些 git 相关文件则不会生成; 可以通过运行 cargo new --vcs=git
来覆盖这些行为。
注意: Git 是一个常用的版本控制系统(version control system, VCS)。可以通过
--vcs
参数使cargo new
切换到其它版本控制系统(VCS), 或者不使用 VCS。运行cargo new --help
参看可用的选项。
.
├── .git
├── .gitignore
├── Cargo.toml
└── src
└── main.rs
文件名: Cargo.toml
[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
这是 Cargo 配置文件的格式。
- 第一行, [package], 是一个片段(section)标题, 表明下面的语句用来配置一个包。随着我们在这个文件增加更多的信息, 还将增加其他片段(section)。
- 接下来的三行设置了 Cargo 编译程序所需的配置: 项目的名称、项目的版本以及要使用的 Rust 版本。附录 E 会介绍
edition
的值。 - 最后一行, [dependencies], 是罗列项目依赖的片段的开始。在 Rust 中, 代码包被称为
crates
。这个项目并不需要其他的crate
。
1.3.2. 构建并运行 Cargo 项目
在 hello_cargo
目录下, 输入下面的命令来构建项目:
$ cargo build
Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs
这个命令会创建一个可执行文件 target/debug/hello_cargo
, 而不是放在目前目录下。由于默认的构建方法是调试构建(debug build), Cargo 会将可执行文件放在名为 debug
的目录中。可以通过这个命令运行可执行文件:
$ ./target/debug/hello_cargo # 或者在 Windows 下为 .\target\debug\hello_cargo.exe
Hello, world!
首次运行 cargo build
时, 也会使 Cargo 在项目根目录创建一个新文件: Cargo.lock
。这个文件记录项目依赖的实际版本。这个项目并没有依赖, 所以其内容比较少。你自己永远也不需要碰这个文件, 让 Cargo 处理它就行了。
我们刚刚使用 cargo build
构建了项目, 并使用 ./target/debug/hello_cargo
运行了程序, 也可以使用 cargo run
在一个命令中同时编译并运行生成的可执行文件:
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running `target/debug/hello_cargo`
Hello, world!
比起要记得运行 cargo build
之后再用可执行文件的完整路径来运行程序, 使用 cargo run
可以实现完全相同的效果, 而且要方便得多, 所以大多数开发者会使用 cargo run
。
注意这一次并没有出现表明 Cargo 正在编译 hello_cargo
的输出。Cargo 发现文件并没有被改变, 所以它并没有重新编译, 而是直接运行了可执行文件。如果修改了源文件的话, Cargo 会在运行之前重新构建项目, 并会出现像这样的输出:
$ cargo run
Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.33 secs
Running `target/debug/hello_cargo`
Hello, world!
Cargo 还提供了一个叫 cargo check
的命令。该命令快速检查代码确保其可以编译, 但并不产生可执行文件:
$ cargo check
Checking hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs
为什么你会不需要可执行文件呢? 通常 cargo check
要比 cargo build
快得多, 因为它省略了生成可执行文件的步骤。如果你在编写代码时持续的进行检查, cargo check
可以让你快速了解现在的代码能不能正常通过编译! 为此很多 Rustaceans 编写代码时定期运行 cargo check
确保它们可以编译。当准备好使用可执行文件时才运行 cargo build
。
1.3.3. 发布(release)构建
当项目最终准备好发布时, 可以使用 cargo build --release
来优化编译项目。这会在 target/release
而不是 target/debug
下生成可执行文件。这些优化可以让 Rust 代码运行的更快, 不过启用这些优化也需要消耗更长的编译时间。这也就是为什么会有两种不同的配置: 一种是为了开发, 你需要经常快速重新构建; 另一种是为用户构建最终程序, 它们不会经常重新构建, 并且希望程序运行得越快越好。如果你在测试代码的运行时间, 请确保运行 cargo build --release
并使用 target/release
下的可执行文件进行测试。
1.3.4. 把 Cargo 当作习惯
对于简单项目, Cargo 并不比 rustc 提供了更多的优势,不过随着开发的深入,终将证明其价值。一旦程序壮大到由多个文件组成,亦或者是需要其他的依赖,让 Cargo 协调构建过程就会简单得多。
即便 hello_cargo
项目十分简单,它现在也使用了很多在你之后的 Rust 生涯将会用到的实用工具。其实,要在任何已存在的项目上工作时,可以使用如下命令通过 Git 检出代码,移动到该项目目录并构建:
$ git clone example.org/someproject
$ cd someproject
$ cargo build
关于更多 Cargo 的信息,请查阅 其文档。