Rust-入门

一、介绍

Rust 编程语言可帮助您编写更快、更可靠的软件。高级人体工程学和低级控制在编程语言设计中往往是不一致的;Rust 挑战了这种冲突。通过平衡强大的技术能力和出色的开发人员体验,Rust 为您提供了控制低级细节(例如内存使用)的选项,而无需传统上与此类控制相关的所有麻烦。

Rust 还为系统编程世界带来了当代的开发者工具:

  • argo 是包含的依赖项管理器和构建工具,它使得在 Rust 生态系统中添加、编译和管理依赖项变得轻松且一致。
  • ustfmt 确保开发人员的编码风格一致。
  • ust 语言服务器为代码完成和内联错误消息的集成开发环境 (IDE) 集成提供支持。
    过在 Rust 生态系统中使用这些和其他工具,开发人员可以在编写系统级代码的同时提高工作效率。

二、入门

安装

我们将通过 下载 Rust rustup,这是一个用于管理 Rust 版本和相关工具的命令行工具。
如果您使用的是 Linux 或 macOS,请打开终端并输入以下命令:

curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

该命令会下载一个脚本并开始安装该rustup 工具,该工具会安装 Rust 的最新稳定版本。系统可能会提示您输入密码。如果安装成功,将出现以下行:
Rust is installed now. Great!

您还需要一个链接器,它是 Rust 用来将其编译输出连接到一个文件中的程序。很可能你已经有了。如果出现链接器错误,则应安装 C 编译器,该编译器通常包含一个链接器。AC 编译器也很有用,因为一些常见的 Rust 包依赖于 C 代码并且需要 C 编译器。

在 macOS 上,您可以通过运行以下命令获得 C 编译器:

xcode-select --install

更新和卸载

通过 安装 Rust 后rustup,更新到最新版本很容易。在您的 shell 中,运行以下更新脚本:

rustupdate

要卸载 Rust 和rustup,请从您的 shell 运行以下卸载脚本:
rustup self uninstall

故障排除

要检查您是否正确安装了 Rust,请打开一个 shell 并输入以下行:

rustc --version

本地文件

Rust 的安装还包括本地文档的副本,因此您可以离线阅读。运行

rustup doc

以在浏览器中打开本地文档。
任何时候标准库提供了类型或函数,而您不确定它的作用或如何使用它时,请使用应用程序编程接口 (API) 文档来找出答案!

Hello World!

现在您已经安装了 Rust,让我们编写您的第一个 Rust 程序。

创建项目目录

您将首先创建一个目录来存储您的 Rust 代码。

mkdir hello_world
cd hello_world

编写和运行 Rust 程序

接下来,创建一个新的源文件并将其命名为main.rs。Rust 文件总是以.rs扩展名结尾。如果您在文件名中使用多个单词,请使用下划线将它们分开。例如,使用hello_world.rs而不是 helloworld.rs。

fn main() {
println!("Hello, world!");
}

保存文件后运行如下命令:
rustc main.rs
./main
Hello, world!

Rust 程序剖析

详细回顾一下您的“Hello, world!”中刚刚发生的事情。程序。这是拼图的第一部分:

fn main() {

}

这些行在 Rust 中定义了一个函数。这个main函数很特别:它总是在每个可执行的 Rust 程序中运行的第一个代码。第一行声明了一个main没有参数且不返回任何内容的函数。如果有参数,它们将放在括号内,().
如果你想在 Rust 项目中坚持标准风格,你可以使用一个自动格式化工具rustfmt来以特定的风格格式化你的代码。Rust 团队已将此工具包含在标准 Rust 发行版中,例如rustc,因此它应该已经安装在您的计算机上!

main函数内部是如下代码:

println!("Hello, world!");

这一行完成了这个小程序中的所有工作:它将文本打印到屏幕上。这里有四个重要的细节需要注意。

  • Rust 风格是缩进四个空格,而不是一个制表符。
  • println!调用一个 Rust 宏。如果它改为调用函数,则输入为println(不带!)。只需要知道使用 a! 意味着你正在调用一个宏而不是一个普通的函数,并且宏并不总是遵循相同的规则职能。
  • 我们将此字符串作为参数传递给println!,然后将字符串打印到屏幕上。
  • 以分号(;)结束该行,这表示此表达式已结束,下一个已准备好开始。
编译和运行是分开的步骤

刚刚运行了一个新创建的程序,因此让我们检查该过程中的每个步骤。

rustc main.rs

如果您有 C 或 C++ 背景,您会注意到这类似于gcc 或clang。编译成功后,Rust 会输出一个二进制可执行文件。
ls
main main.rs

然后我们运行这个二进制文件
./main

这一行将打印Hello, world!到您的终端。
如果您更熟悉动态语言,例如 Ruby、Python 或 JavaScript,您可能不习惯将程序编译和运行作为单独的步骤。Rust 是一种提前编译语言,这意味着您可以编译程序并将可执行文件提供给其他人,他们甚至可以在没有安装 Rust 的情况下运行它。如果您向某人提供.rb、.py或 .js文件,则他们需要(分别)安装 Ruby、Python 或 JavaScript 实现。但是在这些语言中,您只需要一个命令来编译和运行您的程序。一切都是语言设计的权衡。
rustc对于简单的程序,只需编译就可以了,但是随着项目的增长,您将需要管理所有选项并使共享代码变得容易。接下来,我们将向您介绍 Cargo 工具,它将帮助您编写真实的 Rust 程序。

Hello Cargo

Cargo 是 Rust 的构建系统和包管理器。大多数 Rustaceans 使用这个工具来管理他们的 Rust 项目,因为 Cargo 为你处理了很多任务,比如构建代码、下载代码依赖的库以及构建这些库。(我们将您的代码需要的库称为依赖项。)

cargo --version

cargo —version

让我们使用 Cargo 创建一个新项目,看看它与我们原来的“Hello, world!”有何不同。

cargo new hello_cargo
cd hello_cargo

你会看到 Cargo 为我们生成了两个文件和一个目录:一个Cargo.toml文件和一个 src目录,里面有一个main.rs文件。
它还初始化了一个新的 Git 存储库以及一个.gitignore文件。如果您cargo new在现有 Git 存储库中运行,则不会生成 Git 文件;您可以使用cargo new —vcs=git.

Git 是一个常见的版本控制系统。您可以cargo new使用该—vcs标志更改为使用不同的版本控制系统或不使用版本控制系统。

[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2018"

[dependencies]

该文件采用TOML(Tom’s Obvious, Minimal Language)格式,这是 Cargo 的配置格式。

第一行[package]是一个节标题,表示以下语句正在配置包。随着我们向该文件添加更多信息,我们将添加其他部分。

接下来的三行设置 Cargo 编译程序所需的配置信息:名称、版本和要使用的 Rust 版本。

最后一行,[dependencies]是一个部分的开始,用于列出项目的任何依赖项。在 Rust 中,代码包被称为 crates。我们不需要这个项目的任何其他 crate,但我们会在第 2 章的第一个项目中,所以我们将使用这个依赖项部分。

Cargo 希望您的源文件位于src目录中。顶级项目目录仅用于 README 文件、许可证信息、配置文件以及与您的代码无关的任何其他内容。使用 Cargo 可以帮助您组织项目。一切都有一个地方,一切都在它的位置。

建立和运行货运项目

看看当我们构建和运行“Hello, world!”时有什么不同。用 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(或 Windows 上的target\debug\hello_cargo.exe)而不是在您的当前目录中创建一个可执行文件。您可以使用以下命令运行可执行文件:
./target/debug/hello_cargo # or .\target\debug\hello_cargo.exe on Windows
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 还提供了一个名为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 build —release优化来编译它。此命令将在target/release而不是target/debug 中创建一个可执行文件。优化使您的 Rust 代码运行得更快,但启用它们会延长程序编译所需的时间。这就是为什么有两种不同的配置文件:一种用于开发,当您想要快速且频繁地重建时,另一种用于构建您将提供给用户的最终程序,该程序不会重复重建并且运行速度与可能的。如果您正在对代码的运行时间进行cargo build —release基准测试,请务必使用target/release 中的可执行文件运行和进行基准测试。