安装配置
- Cargo是它的包管理工具,类似于npm,可以在这里搜索包crates.io
- 安装完成后
cargo, rustc, rustup
工具会在~/.cargo/bin
中,可以讲他们加入到环境变量中
1 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # 安装rust及对应的工具链 |
Cargo.toml
:类似于package.json
文件
1 | [package] |
基本语法
- 数据类型
- bool、u8、u16、u32、u64、u128、usize、i8、i16、i32、i64、i128、isize、f32、f64、char
- Tuple、Array
- Option: 一种可能为空的值,本质上也是枚举,None表示空,Some代表又值。(好处是能够在编译阶段就能阻止可能发生的错误),拿它的值最好的方法就是
if let
。代码量和我们平时写的if (val !== null)
一样,只是这相当于是强制的了 - Result: 结果,本质也是枚举,Ok表示正常返回值和Err表示异常
?
: 如果一个函数内部有多个可能会抛出异常的地方,可以直接在结尾使用?
表示只要抛错,那么函数返回值就是Err,而不用使用unwrap或者if let了
1 | println!("{} days", day); // 打印变量的值 |
基本变量
1 | // 数字 |
扩展变量
Vec向量
1 | let mut v1 = Vec::new(); |
Struct结构体(类)
- 加上Debug这个trait就能轻松打印了
1 | // Struct结构体(有点像类) |
Enum枚举
1 | enum Gender { |
Trait(抽象类)
1 | triat Playable { |
Iterator迭代器
1 | .map(|x| x + 1) // 这就和js中的map类似了 |
BSON序列化和反序列化
- 很多类型的变量都能表示为BSON值
1 | bson::from_bson() // 序列化 |
流程控制
1 | for i in 1..5 {} // 生成1到4的整数 |
文件操作
1 | let my_str = include_str!("filename"); // 将文件内容读取为字符串 |
测试
- 可以在每个文件的下面编写针对当前文件的测试,他们只有在
cargo test
的时候才会运行,在cargo build
的时候不会
1 |
|
TroubleShooting
- failed to run custom build command for
openssl-sys v0.9.66
: 执行sudo apt install libssl-dev pkg-config -y
- **type ascription is experimental **: 在使用某些实验方法的时候可能会有这个错误,此时只需要将
#![feature(type_ascription)]
放到整个项目入口文件的开头即可main.rs
或者lib.rs
- error: no rules expected the token
aarch64_apple
: 目前我仅在2022-03-22后的几个版本遇到过这个问题,安装rustup install nightly-2022-03-22
版本可以解决(注意使用的时候也需要指定版本cargo +nightly-2022-03-22
),当然如果最新的修复了,可以尝试一下最新的版本 - use of moved value: 通常是因为值饮用造成的,我们需要直接用指针来使用
&var