Rust 探索(一)—— 准备
Rust 探索(一)—— 准备
¶1. 环境配置
首先,需要到Rust的官网上下载Rust语言对应的安装包,点击“马上开始”,跳转到新的页面
这个页面介绍道通过Rustup
这个工具对于Rust进行安装和管理,并且判断出我当前使用的操作系统是Windows,给出了对应的安装器,这里我选择与我自己系统相匹配的64位的.exe
下载完rustup-init.exe
之后,然后执行,会跳出这样一个页面,这里我选择默认的安装,就输入“1”
如果网络情况Ok的话,很快就可以下载完毕,可以看到里面强调Cargo
,这是一个重要的工具,之后会经常用到
为了验证一下Rust是否已经被正确地安装并且添加到环境变量当中,在cmd控制台输入rustc --vertsion
获取一下版本号
1 | rustc --vertsion |
如果一切成功就会显示如下格式的版本号,后面附有版本哈希值以及版本提交日期
¶2. 创建项目
在完成Rust的安装之后,开始创建第一个Rust项目
编写Rust项目可以选择自己趁手的工具,像VS Code或者是Idea这样的IDE都可以,很多工具都有插件支持Rust编程
我自己比较青睐于使用VS Code,尤其是在初学的时候,它带给人轻量级的体验,可以自己做很多细节的工作来了解程序的运作,并且入门的时候本身项目也没有多少量级,管理起来并不麻烦
在创建项目之前,往往需要预留一个供项目存储的目录,这也就是我们的工作区,之后可以把代码放在一起进行保管,这里我创建的目录是rust_projects,创建完成之后使用cd
命令进入目录
这个目录将用来摆放所有的Rust项目,接下来创建第一个项目first_demo,新建对应的目录,然后切换到目录
1 | mkdir first_demo |
Rust的源文件是以.rs
作为扩展名的,因此我们创建一个main.rs 在当前位置调用code .
打开路径
1 | code . |
此时进入VS Code的界面,其他工具也可以直接打开对应目录
现在目录里是空的,直接创建main.rs文件
然后在main.rs中输入以下代码,正如其他语言的“Hello World”一样,即使不懂也能猜出来
1 | fn main() { |
编写完成后,就是对源文件的编译和执行了
在弹出的控制台中输入编译命令,这便是对于main.rs这个源文件执行编译操作
1 | rustc main.rs |
随后查看项目目录,会发现多出了两个文件,明显是编译的产物,一个以.exe
结尾,另一个以.pdb
结尾
接下来会运行main.exe文件,而main.pdb文件包含的是一些调试信息,暂时不会直接用到
1 | .\main.exe |
输入以上命令执行main.exe
“Hello World!”如期而至
¶3. 程序结构简析
接着,通过分析这第一个程序来简单了解一下Rust的一些基础内容
¶3.1. main函数
接触过像C、C++、Java等程序的小伙伴一定都对main函数的概念有很深的印象,这是一个程序的入口,而Rust在这一方面依然延续了传统,main函数也是Rust程序的入口
1 | fn 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
这其实是一个插件套装,包括代码补全、查看源码、常用工具、语法高亮等,可以与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创建项目
首先,先退回上级目录,重新使用Cargo
提供的命令进行项目的创建
1 | cargo new first_cargo |
提示信息描述我创建了一个二进制的包
进入目录,发现已经生成了一些预设的内容,我们直接code .
到VS Code里查看一下
其中src
是我们源代码的路径,里面已经默认生成了一个main.rs
源文件,并且代码内容就是Hello World的打印逻辑(省的再敲了)
¶4.2. 重要配置文件Cargo.toml
可以看到目录下有个Cargo.toml
的文件,里面的内容如下:
1 | [package] |
这个文件主要是描述了项目的一些配置信息,使用TOML(Tom’s Obvious Minimal Language) 编写
接下来,我们就这个文件里的内容进行个简要分析 [package]
和[dependencies]
都是使用[]
包裹起来的,这种格式在TOML
中称为表
这里直接截取了TOML
文档里的部分内容,因此根据对于文档内容的理解,这里就有两个表,分别为package表和dependencies表
红框分别是这两个表的范围
表里的内容就是各种键值对,用来表示配置的属性和对应的值
package表通常与版本密切相关,而dependencies表主要配置各种依赖的其他程序包,等到用的时候再仔细了解一番吧(懒~)
¶4.3. Cargo构建与运行
在当前目录下运行cargo build
可以执行项目构建
1 | cargo build |
构建完后,如图所示的路径下可以找到.exe
,这便是生成的可执行文件
对于该文件,依然可以根据路径,通过命令行执行
另外,还可以使用cargo run
命令将构建与运行合并到一起
1 | cargo run |
构建没有耗时的原因是因为Cargo
发现已经构建过了,就直接运行了
常用的Cargo
命令还有cargo check
,这个命令用于检测代码是否能够通过编译,而不用生成可执行文件,可以提高项目的开发效率,尤其是项目很庞大的时候
项目的开发过程主要用到以上几个,如果是项目发布,则需要在cargo build
或cargo run
后面添加上--release
这个命令行参数即可
1 | cargo build --release |
或
1 | cargo run --release |
此时生成的文件在release目录下
release通常需要编译更长时间进行优化,使代码的运行时有更好性能,而debug则是需要快速编译,这是更加频繁的行为,在其他的语言或者项目也往往有这样的特征
不知怎的,Rust似乎使自己对于一些程序的思想的理解更深刻了,尤其是在写久了业务之后,突然有了很强的探索欲