From dd550f982e48677bddb70b2944ef894854690912 Mon Sep 17 00:00:00 2001 From: Shieber Date: Sun, 17 Apr 2022 13:17:48 +0800 Subject: [PATCH] feat: add rust cheatsheet --- README.md | 1 + languages/rust.rs | 421 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 422 insertions(+) create mode 100644 languages/rust.rs diff --git a/README.md b/README.md index 6615fe9..2f27578 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ - [Bash](languages/bash.sh) - [JavaScript](languages/javascript.md) - [Go](languages/golang.go) +- [Rust](languages/rust.rs) - [PHP](languages/php.php) - [VimScript](languages/vimscript.md) - [Python](languages/python.md) diff --git a/languages/rust.rs b/languages/rust.rs new file mode 100644 index 0000000..30465a6 --- /dev/null +++ b/languages/rust.rs @@ -0,0 +1,421 @@ +/******************************************************************************* + * Rust CHEATSHEET (中文速查表) - by Shieber (created on 2022/04/17) + * Version: 1, Last Modified: 2022/04/17 13:08 + * https://github.com/skywind3000/awesome-cheatsheets + ******************************************************************************/ + +/****************************************************************************** + * rustc 编译器命令 + *****************************************************************************/ +rustc [options] input // rustc [参数] 输入 +rustc file.rs // 编译 crate +rustc --cfg 'verbose' // 配置编译环境 +rustc --cfg 'feature="serde"' // 配置编译环境 +rustc -L // 将目录添加到库搜索路径 +rustc -l // 将生成的 crate 链接到本地库 +rustc --crate-type rlib // 向编译器指明要构建的 crate 类型 +rustc --crate-name name // 向编译器指明要构建的 crate 名称 +rustc --edition 2021 // 向编译器指明要使用的语义版本 +rustc --emit mir // 向编译器指明输出文件的类型 +rustc --print // 打印编译器信息 +rustc -g // 包含调试信息、等同于使用 -C debuginfo=2 +rustc -O // 优化代码、等同于 -C opt-level=2 +rustc -o // 指定输出文件名 +rustc --out-dir dir // 将输出写入的目录 +rustc --explain discription // 提供错误消息的详细说明 +rustc --test // 构建测试工具 +rustc --target TARGET // 选择要构建目标的三要素 +rustc -A // 设置 lint 许可等级 +rustc -W // 设置 lint 警告等级 +rustc -D // 设置 lint 拒绝等级 +rustc -F // 设置 lint 禁止等级 +rustc -C // 代码生成选项 +rustc -V // 输出版本 +rustc -v // 详细输出编译信息 +rustc --extern dir // 指定外部库的位置 + +/****************************************************************************** + * cargo 工具命令 + *****************************************************************************/ +cargo [+toolchain] [options] [subcommand] // cargo [工具链] [参数] [子命令] +cargo -V // 输出版本信息 +cargo -list // 输出 cargo 安装的命令 +cargo --explain code // 调用 rustc --explian code 输出解析信息 +cargo -v // 输出详细信息 +cargo -q // 不输出日志信息 +cargo --color when // 设置是否输出颜色,when 对应 auto、always、never +cargo --frozen // 冻结版本,禁止升级 +cargo --locked // 锁定版本,禁止升级 +cargo --offline // 离线运行 +cargo --config key=value // 覆盖默认的配置值 +cargo -Z flag // 开启 unstable 特性 +cargo -h // 输出帮助信息 +cargo build // 编译包及其依赖项 +cargo run // 编译并运行 +cargo bench // 执行包中的所有 benchmark +cargo test // 运行包中的所有测试 +cargo check // 检查包并报告错误 +cargo clean // 清除 target 目录 +cargo clippy // 检查包代码的错误,用于提升代码质量 +cargo doc // 生成构建包及其依赖的文档 +cargo fix // 自动修复 rustc 抛出的警告 +cargo flamegraph // 生成火焰图 +cargo fmt // 调用 cargofmt 来格式化代码 +cargo new // 新建一个包 +cargo init // 在某目录下新建包 +cargo install // 安装库到 $HOME/.cargo/bin 下 +cargo uninstall // 移除安装的库 +cargo update // 更新 Cargo.lock 里的依赖 +cargo search // 搜索 crates.io 上注册过的 crate +cargo publish // 打包并发布到 crates.io + +/******************************************************************************* + * Package + *******************************************************************************/ +cargo new name --lib // 新建名为 name 的库 +cargo new name --bin // 新建名为 name 的二进制文件 +Cargo.toml // 依赖文件及其他选项配置 +Cargo.lock // 依赖管理 + +/****************************************************************************** + * 关键字 + *****************************************************************************/ +Self enum match super +as extern mod trait +async false move true +await fn mut type +break for pub union +const if ref unsafe +continue impl return use +crate in self where +dyn let static while +else loop struct + +/******************************************************************************* + * 基本数据类型 + *******************************************************************************/ +bool // 布尔 +char // 字符 +str // 不可变序列 +&str // str 的引用 +String // 动态字符串 +tuple // 元组 +array // 数组 +slice // 切片 +isize // 有符号整型 (32位操作系统上为i32,64位操作系统上为i64) +i8 // 8位有符号整型 +i16 // 16位有符号整型 +i32 // 32位有符号整型 +i64 // 64位有符号整型 +usize // 无符号整型(32位操作系统上为u32,64位操作系统上为u64) +u8 // 8位无符号整型 +u16 // 16位无符号整型 +u32 // 32位无符号整型 +u64 // 64位无符号整型 +f32 // 32位浮点数,精确到小数点后7位 +f64 // 64位浮点数,精确到小数点后15位 + +/******************************************************************************* + * Hello World + ******************************************************************************/ +// main.rs + +fn main() { // 主函数 + println!("Hello World!") // println! 宏打印输出 +} +// rustc main.rs // 编译 +// ./main // 运行 + + +/******************************************************************************* + * 操作符 + ******************************************************************************/ +// 算数操作符 ++ - * / % // 加 减 乘 除 取余 +& | ^ // 位与 位或 位异或 位与非 +<< >> // 左移 右移 ++= -= *= /= %= // 加 减 乘 除 取余 [带赋值功能] +&= |= ^= // 位与 位或 位异或 [带赋值功能] +<<= >>= // 左移 右移 [带赋值功能] + +// 比较操作 +== != // 等于 不等于 +< <= // 小于 小于等于 +> >= // 大于 大于等于 + +// 逻辑操作 +&& || ! // 逻辑与 逻辑或 逻辑非 + +// 其他 +& * -> => @ // 引用 解引用 表示返回值 模式匹配 模式绑定 + +/******************************************************************************* + * 变量声明 + ******************************************************************************/ +let a = 1 // 直接声明一个变量,类新自动推导 +let mut b: i8 = 1 // 直接声明一个可变量,指定类型 +const d = 1 // 常量 + +/******************************************************************************* + * 数据类型 + ******************************************************************************/ +let s = "hello" // &str +let c = 'c' // 字符 +let a = 1 // int +let b = 1.2 // float64 + +let arr1 = [0; 5] // 手动指定数组长度 +let arr2 = [0,0,0,0,0] // 由 rust 自动计算长度 + +let sliceInt = &arr2[..3] // 切片 + +let a = &arr1 // 引用 +let a = &arr2[..2] // 部分引用 + +/******************************************************************************* + * 流程控制 + ******************************************************************************/ +// for/for in +for i > 0 { + println!("{i}"); + i -= 1; +} + +for i in arr { + println!("{i}"); +} + +// if/else if/else +if i == 10 { + println!("i == 10") +} else { + println!("i != 10") +} + +// if let/let if +let a = if i > 5 { 2 } else { 3 }; +if let Some(x) = k { x; } else { println!("0"); }; +if let Some(value) = k { + println!("{:?}", value); +} + +// match +match xx { + None => { xxx }, + Some(x) => { xxx }, +} + +// while +while a > 10 { + println!("{a}"); + a -= 1; +} + +while Some(x) = k { + println!("{:?}", x;) +} + +// loop +loop { + if i > 10 { + break; + } + + println!("{i}"); + i += 1; +} + +/******************************************************************************* + * 函数 + ******************************************************************************/ +// 以 fn 关键字声明 +fn function(var1: type, var2: type) -> returnType { + codeBody; + returnValue +} + +// 闭包函数 +let f = |x, y| { codeBody; returnValue } +f() + +// 函数多返回值 +fn get() -> (type1, type2) { + codeBody; + (value1, value2) +} + +/******************************************************************************* + * 结构体 + ******************************************************************************/ +// rust 中没有class只有struct +struct People { + age: u8 + pub name: String // pub 开头的变量可在包外访问 +} + +let p1 = People{ // 最好按照结构体内部定义的顺序 + age: 25, + name: "Kaven".to_string() +} + +let age = 20; +let p1 = People{ // 有同名变量,直接使用 + age, + name: "Shieber".to_string() +} + +/******************************************************************************* + * 方法 + ******************************************************************************/ +// 方法通常是针对一个 trait 来说的 +trait Foo { + fn get(x: type1, y: type2) -> returnType; +} + +impl Foo for xx {} + +// xx 重载 get 方法 +impl xx { + fn get(x: type1, y: type2) -> returnType { + codeBody; + returnValue + } +} + +/******************************************************************************* + * Trait + ******************************************************************************/ +// rust 的 trait 类似其他语言的接口这个概念 +trait Reader { + fn reading(); // 实现 reading 方法就实现了接口 Reader +} + +impl Reader for xx { + fn reading() -> returnType { + codeBody; + returnValue + } +} + +/******************************************************************************* + * 泛型 + ******************************************************************************/ +fn add(x: T, y: T) -> T { + x + y +} + +fn main() { + let a = 1; + let b = 2; + let c = 1.0; + let d = 2.0; + let e = add(a, b); + let f = add(c, d); + println!("{e}, {f}"); +} + +/******************************************************************************* + * 函数式编程 + ******************************************************************************/ +fn main() { + // 求小于1000的能被3或5整除的所有整数之和 + let sum = (1..1000).filter(|n| n % 3 == 0 || n % 5 == 0).sum::(); + println!("{sum}"); +} + +/******************************************************************************* + * 异常处理 + ******************************************************************************/ +use std::fs::File; +use std::fs::io; +use std::fs::io::ErrorKind; +use std::fs::Read; + +fn main() { + let f = Fill::oepn("test.txt"); + let f = match f { + Ok(file) => file, + Err(err) => match err.kind() { + ErrorKind::NotFound => match Fill::crate("test.txt") { + Ok(fc) => fc, + Err(e) => panic!("Error while creating file!"), + } + ErrorKind::PermissionDenied => panic!("PermissionDenied"), + other => panic!("Error while openning file!"), + } + } + + let a = Fill::oepn("test.txt").unwrap(); // 直接 unwrap,不用 match,有错报错 + let b = Fill::oepn("test.txt").expect("Error while openning file!"); // 添加额外错误信息 + let c = Fill::oepn("test.txt")?; // 将错误往上抛 +} + +/******************************************************************************* + * 宏系统 + ******************************************************************************/ +// 宏定义格式 +macro_rules! macro_name { + ($matcher) => { + $code_body; + return_value + }; +} + +// 求树的左子节点 +macro_rules! left_child { + ($parent:ident) => { + $parent << 1 + }; +} + +// 求树的右子节点 +macro_rules! right_child { + ($parent:ident) => { + ($parent << 1) + 1 + }; +} + +/******************************************************************************* + * 资源整理 + ******************************************************************************/ +// 入门书籍 +《Rust 程序设计语言》 // 官方出品 +《深入浅出 Rust》 // 推荐 +《Rust 语言圣经》 // 推荐 + +// 进阶书籍/文档 +《Cargo 教程》 +《Rust 编程之道》 +《rustc 手册》 +《Rust 死灵书》 +《Rust 异步编程》 + +// 特定领域 +Wasm: https://wasmer.io、https://wasmtime.dev、https://wasmedge.org +HTTP/3: https://github.com/cloudflare/quiche +coreutils: https://github.com/uutils/coreutils +算法: https://github.com/TheAlgorithms/Rust +游戏: https://github.com/bevyengine/bevy +工具: https://github.com/rustdesk/rustdesk +区块链: https://github.com/w3f/polkadot +数据库: https://github.com/tikv、https://github.com/tensorbase/tensorbase +编译器: https://github.com/rust-lang/rustc_codegen_gcc +操作系统: https://github.com/Rust-for-Linux、https://github.com/rcore-os +Web 前端: https://github.com/yewstack/yew、 https://github.com/denoland/deno +Web 后端: https://actix.rs/、 https://github.com/tokio-rs/axum、 https://github.com/poem-web/poem + +// 资源网站 +Rust 官网: https://www.rust-lang.org +Rust 源码: https://github.com/rust-lang/rust +Rust 文档: https://doc.rust-lang.org/stable +Rust 参考: https://doc.rust-lang.org/reference +Rust 杂志: https://rustmagazine.github.io/rust_magazine_2021 +Rust 库/箱: https://crates.io、https://lib.rs +Rust 中文社区: https://rustcc.cn +Rust 乐酷论坛: https://learnku.com/rust +Rust 资料搜集: https://www.yuque.com/zhoujiping/programming/rust-materials +Rust LeetCode: https://rustgym.com/leetcode +Awesome Rust: https://github.com/rust-unofficial/awesome-rust +Rust Cheat Sheet: https://cheats.rs +芽之家: https://books.budshome.com +令狐壹冲: https://space.bilibili.com/485433391