01-开始Rust之旅

上一篇:00-Rust前言


1. 下载Rust

官方推荐使用 ++rustup++ 下载 Rust,这是一个管理 Rust 版本和相关工具的命令行工具。下载时需要连接互联网。

这边提供了离线安装版本。本人学习的机器环境为: ubuntu x86_64,因此选用第②个工具链;

  1. rust-1.75.0-x86_64-pc-windows-gnu.msi

  2. rust-1.75.0-x86_64-unknown-linux-gnu.tar.gz

bash 复制代码
$ rustc --version

rustc 1.75.0 (82e1608df 2023-12-21)

2. 编写和运行 Rust 程序

Rust 对编辑、工具或代码的存放位置没有特别的要求,因此如果你喜欢使用集成开发环境(IDE)而不是命令行,请随意使用你喜欢的集成开发环境。许多集成开发环境现在都在一定程度上支持 Rust;Rust 团队一直致力于通过 ++rust-analyzer++ 实现对集成开发环境的强大支持。

vscode可直接安装rust-anslyzer插件;

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

rust 复制代码
fn main() {
    println!("Hello, Rust!");
}

保存文件,在 Linux输入以下命令编译并运行文件:

rust 复制代码
$ rustc main.rs
$ ./main
Hello, Rust!

2.1 Rust 程序剖析

这几行定义了一个名为 main 的函数。 main 函数很特别:它总是每个可执行 Rust 程序中运行的第一段代码。这里,第一行声明了一个名为 main 的函数,该函数没有参数,也不返回任何内容。如果有参数,则会放在括号 () 中。

函数体用 {} 封装。Rust 要求在所有函数体周围使用大括号。++好的做法是将开头的大括号与函数声明放在同一行,中间空一格++。

注意:如果你想在 Rust 项目中坚持使用一种标准样式,可以使用一个名为 rustfmt 的自动格式化工具,以特定样式格式化你的代码。Rust 团队已将该工具包含在标准 Rust 发行版中,就像 rustc 一样!

main 函数的主体包含以下代码:

rust 复制代码
    println!("Hello, Rust!");

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

首先,Rust 风格是缩进四个空格,而不是制表符。

其次, println! 调用的是 Rust 宏。如果它调用的是一个函数,就会以 println 的形式输入(去掉 ! )。++使用 ! 意味着你调用的是宏而不是普通函数,而且宏并不总是遵循与函数相同的规则++。

第三,您将看到 "Hello, world!" 字符串。我们将这个字符串作为参数传递给 println! ,然后字符串就会被打印到屏幕上。

第四,我们用分号 ( ; ) 结束这一行,表示这个表达式结束,下一个表达式准备开始。++Rust 代码的大多数行都以分号结束++。

2.2 编译和运行是不同的步骤

在运行 Rust 程序之前,您必须使用 Rust 编译器对其进行编译,方法是输入 rustc 命令并将源文件的名称传给它,就像这样:

rust 复制代码
rustc main.rs

如果你有 C 或 C++ 背景,就会发现这与 gcc 或 clang 类似。编译成功后,Rust 会输出一个二进制可执行文件。

cpp 复制代码
g++ -o demo demo.cpp

接着,运行main可执行程序,在终端即可输出"Hello, Rust"文本。

rust 复制代码
./main

对于简单的程序来说,只用 rustc 进行编译就可以了,但随着项目的发展,你会希望管理所有选项,并方便共享代码。接下来,我们将向你介绍 Cargo 工具,它将帮助你编写真实世界的 Rust 程序。

3. Cargo

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

从这一点上看,和Android中的Gradle很像;

最简单的 Rust 程序,比如我们目前编写的程序,不需要任何依赖库。如果我们用 Cargo 构建了 "Hello, Rust!"项目,它将只使用 Cargo 中负责构建代码的部分。当你编写更复杂的 Rust 程序时,你会添加依赖关系,如果你使用 Cargo 启动一个项目,添加依赖关系就会容易得多。

请在终端输入以下命令检查 Cargo 是否已安装:

bash 复制代码
$ cargo --version
cargo 1.75.0 (1d8b05cdd 2023-11-20)

3.1 用Cargo创建项目

让我们使用 Cargo 创建一个新项目,看看它与最初的 "Hello, Rust!"项目有何不同。回到你的项目目录(或你决定存储代码的地方)。然后,在任何操作系统上运行以下命令:

bash 复制代码
$ cargo new hello_cargo
$ cd hello_cargo

第一条命令会创建一个名为 hello_cargo 的新目录和项目。我们将项目命名为 hello_cargo,Cargo 会在同名目录下创建文件。

进入 hello_cargo 目录并列出文件。你会看到 Cargo 为我们生成了两个文件和一个目录:一个 Cargo.toml 文件和一个包含 main.rs 文件的 src 目录。

它还初始化了一个新的 Git 仓库和一个 .gitignore 文件。如果在现有的 Git 仓库中运行 cargo new ,则不会生成 Git 文件;您可以使用 cargo new --vcs=git .

注:Git 是一种常见的版本控制系统。您可以使用 --vcs 标志更改 cargo new 以使用其他版本控制系统或不使用版本控制系统。运行 cargo new --help 查看可用选项。

在文本编辑器中打开 Cargo.toml。它应该与下面代码相似。

bash 复制代码
[package]
name = "hell_cargo"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

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

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

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

最后一行,++[dependencies] ,是列出项目依赖关系的开头部分++。在 Rust 中,代码包被称为 crates。在本项目中,我们不需要任何其他依赖部分。

现在打开 src/main.rs,看一看:

rust 复制代码
fn main() {
    println!("Hello, world!");
}

Cargo 已经为你生成了一个 "Hello, world!"程序,就像我们之前编写的程序一样!到目前为止,我们的项目与 Cargo 生成的项目之间的区别在于:Cargo 将代码放在了 src 目录中,在顶层目录中添加了一个 Cargo.toml 配置文件。

Cargo 希望你的源文件位于 src 目录中。++项目顶层目录只用于存放 README 文件、许可证信息、配置文件以及其他与代码无关的内容++。使用 Cargo 可以帮助你组织项目。每样东西都有自己的位置,每样东西都有自己的位置。

如果你启动了一个不使用 Cargo 的项目,就像我们的 "Hello, world!"项目一样,你可以将它转换成一个使用 Cargo 的项目。将项目代码移至 src 目录,并创建一个合适的 Cargo.toml 文件。

3.2 构建及运行Cargo项目

现在,让我们看看使用 Cargo 构建并运行 "Hello, world!"程序时会有哪些不同!在 hello_cargo 目录下,输入 ++cargo build++ 命令构建项目:

bash 复制代码
$ cargo build
   Compiling hell_cargo v0.1.0 (/home/username/rustProj/hell_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.14s

++该命令会在 target/debug/hello_cargo 中创建一个可执行文件,而不是在当前目录下++。由于默认编译是调试编译,因此 Cargo 会将二进制文件放到名为 debug 的目录中。你可以用这条命令运行可执行文件:

bash 复制代码
$ ./target/debug/hell_cargo 
Hello, world!

如果一切顺利, Hello, world! 将打印到终端。++首次运行 cargo build 还会导致 Cargo 在顶层创建一个新文件:Cargo.lock++ 。该文件记录了项目中依赖项的确切版本。本项目中没有依赖项,所以文件有点少。++你不需要手动修改这个文件,Cargo 会帮你管理它的内容++。

This file is automatically @generated by Cargo.

It is not intended for manual editing.

version = 3

[[package]]

name = "hell_cargo"

version = "0.1.0"

我们刚用 cargo build 构建了一个项目,然后用 ./target/debug/hello_cargo 运行了它,但我们也可以用 ++cargo run++ 编译代码,然后在一条命令中运行生成的可执行文件:

bash 复制代码
cargo run
   Compiling hell_cargo v0.1.0 (/home/username/rustProj/hell_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.14s
     Running `target/debug/hell_cargo`
Hello, world!

使用 cargo run 比记住运行 cargo build 然后使用二进制文件的整个路径更方便,因此大多数开发人员使用 cargo run 。

请注意,当我们再次运行 cargo run 时,这次我们没有看到 Cargo 正在编译 hello_cargo 的输出。++Cargo 发现文件没有变化,所以没有重建,只是运行了二进制文件++。

bash 复制代码
cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/hell_cargo`
Hello, world!

如果你修改了源代码,Cargo 会在运行前重建项目。

和Makefile功能类似;

Cargo 还提供了一个名为 cargo check 的命令。该命令可快速检查您的代码,确保其可编译但不会生成可执行文件:

bash 复制代码
cargo check
    Checking hell_cargo v0.1.0 (/home/username/rustProj/hell_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.02s

为什么不需要可执行文件?通常, cargo check 要比 cargo build 快得多,因为它跳过了生成可执行文件的步骤。如果你在编写代码的过程中不断检查你的工作,那么使用 cargo check 将加快让你知道你的项目是否仍在编译的过程!因此,++许多 Rustaceans 在编写程序时都会定期运行 cargo check ,以确保程序编译成功++。然后在准备使用可执行文件时运行 cargo build 。

3.3 发布release版本

当项目最终准备发布时,可以使用 cargo build --release 对其进行优化编译。该命令将在 target/release 而不是 target/debug 下创建可执行文件。++优化会让 Rust 代码运行得更快,但开启优化会延长程序的编译时间++。

这就是为什么有两种不同的配置文件:一种用于开发,当你想快速、频繁地重建程序时;另一种用于编译最终的程序,你将把它交给用户,它不会被反复重建,而且会尽可能快地运行。

++如果要对代码运行时间进行基准测试,请确保运行 cargo build --release ,并使用 target/release 中的可执行文件进行基准测试++。

bash 复制代码
cargo build --release
   Compiling hell_cargo v0.1.0 (/home/username/rustProj/hell_cargo)
    Finished release [optimized] target(s) in 0.14s

4. 将Cargo统一作为项目的编译工具

对于简单的项目,Cargo 并不能提供比使用 rustc 更多的价值,但当你的程序变得越来越复杂时,它将证明自己的价值。一旦程序增加到多个文件或需要依赖关系,让 Cargo 来协调构建就容易多了。

尽管 hello_cargo 项目很简单,但它使用了你在 Rust 职业生涯中将会用到的许多真正的工具。事实上,要处理任何现有项目,你都可以使用以下命令使用 Git 查看代码,切换到项目目录并构建:

bash 复制代码
$ git clone example.org/someproject
$ cd someproject
$ cargo build

下一篇:02-编程猜谜游戏

相关推荐
计算机毕设指导63 分钟前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
Gu Gu Study4 分钟前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言
时光の尘19 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
paopaokaka_luck20 分钟前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
以后不吃煲仔饭33 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师33 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
前端拾光者37 分钟前
利用D3.js实现数据可视化的简单示例
开发语言·javascript·信息可视化
程序猿阿伟39 分钟前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
傻啦嘿哟1 小时前
如何使用 Python 开发一个简单的文本数据转换为 Excel 工具
开发语言·python·excel
大数据编程之光1 小时前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink