VS Code 插件
rust-analyzer:它会实时编译和分析你的 Rust 代码,提示代码中的错误,并对类型进行标注。你也可以使用官方的 Rust 插件取代。rust syntax:为代码提供语法高亮。crates:帮助你分析当前项目的依赖是否是最新的版本。Even Better TOML:Rust 使用 toml 做项目的配置管理。better toml 可以帮你语法高亮,并展示 toml 文件中的错误。rust test lens:可以帮你快速运行某个 Rust 测试。
工具简介
cargo
Rust 的包管理器,构建工具和依赖解决器。可以使用 cargo 命令创建、编辑和构建 Rust 项目
cargo new --bin my_project可以创建一个名为 my_project 的新的 Rust 项目
rustup
用来升级维护 Rust 编译器套件的版本同时支持维护多个版本,并可用来安装 Rust 组件
rustup update stable可将 Rust stable 版本升级至最新
rust-fmt
可用来对 Rust 代码按配置格式进行自动排版,用来统一 Rust 代码风格
配合 cargo,直接在工程目录下运行 cargo fmt 就可以对整个工程进行排版
rust-clippy
可用来对 Rust 代码进行严谨性检查指出一些写得不规范的地方
直接在工程目录下运行 cargo clippy 就可以对整个工程进行排版
所有权
Rust明确了所有权的概念,值也可以叫资源,所有权就是拥有资源的权利。一个变量拥有一个资源的所有权,那它就要负责那个资源的回收、释放。 Rust基于所有权定义出发,推导出了整个世界。
所有权的基础是三条定义。
Rust中,每一个值都有一个所有者。
任何一个时刻,一个值只有一个所有者。
当所有者所在作用域(scope)结束的时候,其管理的值会被一起释放掉。
这三条规则涉及两个概念: 所有者和作用域。
所谓所有者,在代码里就用变量表示。而变量的作用域,就是变量有效(valid)的那个代码区间。在Rust中,一个所有权型变量的作用域,简单来说就是它定义时所在的那个最里层的花括号括起的部分,从变量创建时开始,到花括号结束的地方。
堆内存资源随着关联的栈上局部变量一起被回收 的内存管理特性,叫作 RAII(Resource Acquisition Is Initialization)
移动和复制所有权
u32这种类型在做变量的再赋值的时候,是做了复制所有权的操作。而String这种类型在做变量再赋值的时候,是做了移动所有权的操作。
默认做复制所有权的操作的有7种。
所有的整数类型,比如u32;
布尔类型bool;
浮点数类型,比如f32、f64;
字符类型char;
由以上类型组成的元组类型 tuple,如(i32, i32, char);
由以上类型组成的数组类型 array,如 [9; 100];
不可变引用类型&。
其他类型默认都是做移动所有权的操作。
引用
引用分成不可变引用和可变引用。
&x是对变量x的不可变引用。&mut x是对变量x的可变引用一个所有权型变量的作用域是从它定义时开始到花括号结束。而引用型变量的作用域不是这样, 引用型变量的作用域是从它定义起到它最后一次使用时结束,定义引用,但并没有被使用,它的作用域就只有那一行
一个所有权型变量的可变引用与不可变引用的作用域不能交叠,也可以说不能同时存在
引用(不可变引用和可变引用)型变量的作用域不会长于所有权变量的作用域。这是肯定的,不然就会出现悬锤引用,这是典型的内存安全问题。
一个所有权型变量的不可变引用可以同时存在多个,可以复制多份。
某个时刻对某个所有权型变量只能存在一个可变引用,不能有超过一个可变借用同时存在,也可以说,对同一个所有权型变量的可变借用之间的作用域不能交叠。
在有借用存在的情况下,不能通过原所有权型变量对值进行更新。当借用完成后(借用的作用域结束后),物归原主,又可以使用所有权型变量对值做更新操作了。
多级引用
只有全是多级可变引用的情况下,才能修改到目标资源的值。
对于多级引用(包含可变和不可变),打印语句中,可以自动为我们解引用正确的层数,直到访问到目标资源的值,这很符合人的直觉和业务的需求。