Rust 探索(一)—— 准备

1. 环境配置

入门 - Rust 程序设计语言 (rust-lang.org)

首先,需要到Rust的官网上下载Rust语言对应的安装包,点击“马上开始”,跳转到新的页面

image.png

这个页面介绍道通过Rustup这个工具对于Rust进行安装和管理,并且判断出我当前使用的操作系统是Windows,给出了对应的安装器,这里我选择与我自己系统相匹配的64位的.exe

image.png

下载完rustup-init.exe之后,然后执行,会跳出这样一个页面,这里我选择默认的安装,就输入“1”

image.png

image.png

如果网络情况Ok的话,很快就可以下载完毕,可以看到里面强调Cargo,这是一个重要的工具,之后会经常用到

image.png

为了验证一下Rust是否已经被正确地安装并且添加到环境变量当中,在cmd控制台输入rustc --vertsion获取一下版本号

1
> rustc --vertsion

如果一切成功就会显示如下格式的版本号,后面附有版本哈希值以及版本提交日期

image.png

2. 创建项目

在完成Rust的安装之后,开始创建第一个Rust项目
编写Rust项目可以选择自己趁手的工具,像VS Code或者是Idea这样的IDE都可以,很多工具都有插件支持Rust编程
我自己比较青睐于使用VS Code,尤其是在初学的时候,它带给人轻量级的体验,可以自己做很多细节的工作来了解程序的运作,并且入门的时候本身项目也没有多少量级,管理起来并不麻烦

在创建项目之前,往往需要预留一个供项目存储的目录,这也就是我们的工作区,之后可以把代码放在一起进行保管,这里我创建的目录是rust_projects,创建完成之后使用cd命令进入目录

image.png

这个目录将用来摆放所有的Rust项目,接下来创建第一个项目first_demo,新建对应的目录,然后切换到目录

1
2
> mkdir first_demo
> cd first_demo

Rust的源文件是以.rs作为扩展名的,因此我们创建一个main.rs 在当前位置调用code .打开路径

1
> code .

此时进入VS Code的界面,其他工具也可以直接打开对应目录

image.png

现在目录里是空的,直接创建main.rs文件

image.png

然后在main.rs中输入以下代码,正如其他语言的“Hello World”一样,即使不懂也能猜出来

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

编写完成后,就是对源文件的编译执行

image.png

在弹出的控制台中输入编译命令,这便是对于main.rs这个源文件执行编译操作

image.png

1
>  rustc main.rs

随后查看项目目录,会发现多出了两个文件,明显是编译的产物,一个以.exe结尾,另一个以.pdb结尾

image.png

接下来会运行main.exe文件,而main.pdb文件包含的是一些调试信息,暂时不会直接用到

1
>  .\main.exe

输入以上命令执行main.exe

image.png

“Hello World!”如期而至

3. 程序结构简析

接着,通过分析这第一个程序来简单了解一下Rust的一些基础内容

3.1. main函数

接触过像C、C++、Java等程序的小伙伴一定都对main函数的概念有很深的印象,这是一个程序的入口,而Rust在这一方面依然延续了传统,main函数也是Rust程序的入口

1
2
3
fn main() {
// main函数的具体内容
}

fn关键字声明了函数,而这个函数的名称非常特殊,叫main,很显然,这个名字是不能乱用的
main的后面有使用()界定的参数列表,但是对于main函数来说,里面什么也不需要,并且这个函数也没有返回值
小结一下,main函数名称为main的函数,不接受参数,无返回值

{}包裹的内容是main函数函数体,并且在Rust语言当中,要求所有函数体一律需要使用{}包裹起来

程序运行后,从入口执行,执行的内容正是写在main函数的花括号之间的语句了

3.2. 语句

println!("Hello World!");便是main函数的函数体里面唯一的一条语句了,也就是说整个程序所做的有意义的事情就集中在这一行代码上,前后都只是固定的函数框架

println!在Rust函数中被称为,这是因为其带有!符号,普通的函数尾部没有!暂且可以将其当做一种特殊的函数进行代入,这目前并不影响理解程序的逻辑流程,它的参数就是里面的字符串字面量,接收字符串作为输入,然后通过调用将内容输出到控制台

与传统的C-Like语言C++,Java一样,Rust是需要使用;表明语句的结束的,否则会报错

另外,建议安装一下这个插件,可以在VS Code上提供一些便利,直接将VS Code组装成用于Rust开发的IDE

image.png

这其实是一个插件套装,包括代码补全、查看源码、常用工具、语法高亮等,可以与rustup工具链很好地配合

3.3. 编译与运行

通过之前的命令行操作,其实我们能够分明地感受到编译运行这两个过程,再回忆一下

3.3.1. 编译

1
>  rustc main.rs

使用rustc命令可以对.rs结尾的Rust源文件进行编译,如果熟悉C++的小伙伴可能比较熟悉这个过程,这样的编译的重要产物便是二进制的可执行文件,Rust根据操作系统生成不同的文件,在Windows操作系统下生成的是.pdb.exe,而Linux和macOS则不同

3.3.2. 运行

1
>  .\main.exe  

运行其实就是对于编译过程中生成的可执行二进制文件进行运行,在Windows系统下便是.exe

4. 使用Cargo

如果我们的项目都只是一些结构逻辑简单的小工具,那么就这样新建点源文件,然后编译、运行就Ok了
然而,事实并非这样,实际应用的项目往往会有若干的功能模块与庞大的代码量,并且形形色色的项目构建构建工具不断涌现,带领项目构建管理走向自动化,比如Gradle、Maven、CMake

在Rust中,项目的构建管理借助于Cargo,接下来便尝试使用Cargo重新创建之前的项目

4.1. Cargo创建项目

image.png

首先,先退回上级目录,重新使用Cargo提供的命令进行项目的创建

1
> cargo new first_cargo

提示信息描述我创建了一个二进制的包

image.png

进入目录,发现已经生成了一些预设的内容,我们直接code .到VS Code里查看一下

image.png

image.png

其中src是我们源代码的路径,里面已经默认生成了一个main.rs源文件,并且代码内容就是Hello World的打印逻辑(省的再敲了)

image.png

4.2. 重要配置文件Cargo.toml

TOML:Tom 的(语义)明显、(配置)最小化的语言

可以看到目录下有个Cargo.toml的文件,里面的内容如下:

1
2
3
4
5
6
7
8
[package]
name = "first_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) 编写

接下来,我们就这个文件里的内容进行个简要分析 [package][dependencies]都是使用[]包裹起来的,这种格式在TOML中称为

这里直接截取了TOML文档里的部分内容,因此根据对于文档内容的理解,这里就有两个表,分别为package表dependencies表

image.png

红框分别是这两个表的范围 image.png

表里的内容就是各种键值对,用来表示配置的属性和对应的值

image.png

package表通常与版本密切相关,而dependencies表主要配置各种依赖的其他程序包,等到用的时候再仔细了解一番吧(懒~)

4.3. Cargo构建与运行

在当前目录下运行cargo build可以执行项目构建

1
> cargo build

image.png

构建完后,如图所示的路径下可以找到.exe,这便是生成的可执行文件

image.png

对于该文件,依然可以根据路径,通过命令行执行

另外,还可以使用cargo run命令将构建与运行合并到一起

1
> cargo run

image.png

构建没有耗时的原因是因为Cargo发现已经构建过了,就直接运行了

常用的Cargo命令还有cargo check,这个命令用于检测代码是否能够通过编译,而不用生成可执行文件,可以提高项目的开发效率,尤其是项目很庞大的时候

项目的开发过程主要用到以上几个,如果是项目发布,则需要在cargo buildcargo run后面添加上--release这个命令行参数即可

1
> cargo build --release

1
> cargo run --release

image.png

此时生成的文件在release目录下

image.png

release通常需要编译更长时间进行优化,使代码的运行时有更好性能,而debug则是需要快速编译,这是更加频繁的行为,在其他的语言或者项目也往往有这样的特征

不知怎的,Rust似乎使自己对于一些程序的思想的理解更深刻了,尤其是在写久了业务之后,突然有了很强的探索欲