主要内容:

  • 在 macOS 中装置 Rust
  • 编写 Hello World 程序
  • 运用 Rust 包办理和构建东西 cargo

装置 Rust

在 macOS 中,运用 rustup 进行装置。

$ curl https://sh.rustup.rs -sSf | sh

这条指令会下载并履行一个脚本来装置 rustup 东西,来装置最新的 Rust 安稳版别。

成功后会看到如下输出:

Rust is installed now. Great!

这个装置会主动把 Rust 东西链添加到环境变量中,在下次翻开终端时收效,假如想要在当时终端立即收效,能够输入下面指令:

source "$HOME/.cargo/env"

查看 Rust 是否正确装置:

rustc --version

正确装置的话,会输出如下格式的信息:最新安稳版别的版别号,版别的哈希码,版别提交日期

rustc x.y.z (abcabcabc yyyy-mm-dd)
// 比方
rustc 1.67.1 (d5a82bbd2 2023-02-07)

装置东西履行时会在本地生成一份离线文档,能够经过以下指令在浏览器中翻开:

rustup doc

当不清楚某个函数的用处和运用方法时,能够经过该文档进行查询。

Rust 的 Hello World

这节来编写第一个 Rust 程序,典中典的 Hello World。

能够运用 VS Code 这个 IDE 来编写 Rust,在扩展中搜索 Rust,挑选 「rust-analyzer」这个插件,装置并启用。

Rust Hello World

创立一个文件夹,比方叫做 rust_learning,在 VS Code 中翻开,并在这个文件夹下新建一个 Rust 程序文件,Rust 文件的后缀是 .rs,比方 hello.rs,假如姓名运用多个单词,规范是在单词间用下划线 _ 分隔,比方 hello_world.rs

hello.rs 中写下如下代码:

fn main() {
    println!("Hello World!");
}

经过下面的指令来编译并运转这个程序:

// 编译
rustc hello.rs
// 运转
./hello
// 运转成果
Hello World!

分析这个程序

  • fn main() {} 定义了一个 Rust 的函数,main 函数是 Rust 程序的进口函数
  • 花括号 {} 用来包裹函数体,Rust 要求一切的函数都要被花括号包裹,引荐把左花括号和函数声明写在同一行,并用空格分隔。
  • println! 是调用了一个宏,Rust 中一切以 ! 结尾的调用都是在调用宏而不是普通函数。
  • 规范 Rust 风格运用 4 个空格而不是 Tab 来缩进
  • 大部分 Rust 代码行会以分号 ; 来结尾

编译和运转

编译和运转是两个不同的步骤。

在运转 Rust 程序之前,需求运用 rustc 指令及源文件名作为参数来编译它:

rustc hello.rs

这和 C 或 C++ 的编译十分相似,一旦编译成功,会取得一个二进制的可履行文件。

查看生成的可履行文件:

$ ls
hello hello.rs

接下来,经过如下方法运转可履行文件:

./hello

仅仅运用 rustc 编译简单的程序不费事,但随着项目规模的变大,开发成员变多,咱们最好运用构建东西来简化这些复杂的作业。也便是 cargo

cargo

cargo 是 Rust 东西链中内置的构建系统及包办理器。它能够用来构建代码,下载依靠库等。

运用 rustup 东西下载装置 Rust,cargo 已经内置了。

能够经过下面指令来查看 cargo 是否正确装置:

$ cargo --version

当输出是形如 cargo 1.67.1 (8ecd4f20a 2023-01-10) 这样的一串版别号时,阐明 cargo 能够正常运用,假如输出是相似 command not found 这样的错误信息,则需求独自装置 cargo。

运用 cargo 创立项目

$ cargo new hello_cargo
// 输出
Created binary (application) `hello_cargo` package
$ cd hello_cargo

创立出来的项目结构如下所示:

├── hello_cargo
│  ├── .gitignore      // cargo 会初始化 Git 仓库,生成默许的 .gitignore 文件
│ ├── Cargo.toml      // 包括程序包装备及依靠等信息
│ └── src             // 放置源代码的目录
│     └── main.rs     // 源码文件

Cargo.toml 的内容

[package]
name = "hello_cargo"
version = "0.1.0"
authors = ""
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

Cargo 运用 TOML(Tom's Obvious, Minimal Language) 作为规范装备格式。

package 是个区域标签,表明接下来的句子是装备当时的程序包

  • name 程序名
  • version 版别号
  • authors 作者信息
  • edition

dependencies 也是个区域标签,声明项目的依靠。在 Rust 中,把代码的调集称为 包(create)。

依照惯例,Cargo 会默许把一切源代码文件放在 src 目录下,项目根目录只用来放置 README 文档许可声明装备文件 等与源码无关的文件。

运用 Cargo 构建和运转项目

  • cargo build

Cargo 能够经过如下指令完结构建:

$ cargo build
// 运转成果
Compiling hello_cargo v0.1.0 (/Users/owen/Workspace/VSCodeProjects/rust_learning/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.78s

这个指令会将可履行程序生成在路径 ./target/debug/hello_cargo 下,能够用下面的指令来运转:

$ ./target/debug/hello_cargo
// 运转成果
Hello, world!

cargo build 还会在项目根目录下创立一个名为 Cargo.lock 的新文件,这个文件记载了当时项目一切依靠库的详细版别号。不要手动编辑其中的内容,Cargo 会主动维护。

  • cargo run

也能够直接运用 cargo run 指令来一次性完结编译和运转:

$ cargo run
// 运转成果
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/hello_cargo`
Hello, world!

这次的输出没有提示编译信息,这是由于 Cargo 发现源码没有修正,所以直接运转了生成的可履行文件,假如修正的源码,Cargo 会在运转前重新构建项目:

$ cargo run
// 运转成果
   Compiling hello_cargo v0.1.0 (/Users/owen/Workspace/VSCodeProjects/rust_learning/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.12s
     Running `target/debug/hello_cargo`
Hello, Rust and Cargo!
  • cargo check

Cargo 还供给了 check 指令来快速查看当时代码是否能够经过编译,而不需求花费额定的时刻生成可履行程序,运转速度远远快于 build 指令。

$ cargo check
// 运转成果
Finished dev [unoptimized + debuginfo] target(s) in 0.00s

以 Release 形式进行构建

当预备发布自己的项目时,能够运用 cargo build --releasecargo run --release 在优化形式下构建并生成可履行程序。生成的可履行文件会放在 target/release 目录下,而非 target/debug。这个形式会以更长的编译时刻来优化代码,使代码拥有更好的运转时性能。

假如需求对代码的运转功率进行基准测验,请保证运用 cargo run --release 进行构建并运用 target/release 目录下的可履行文件进行测验。

$ cargo run --release
// 运转成果
    Finished release [optimized] target(s) in 0.00s
     Running `target/release/hello_cargo`
Hello, Cargo!