From e66c1c57fd933156c85c8502e30789acf92acc6f Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Thu, 3 Nov 2022 15:32:56 +0800 Subject: [PATCH] feat: add `rust.md` cheatsheet (#20). --- README.md | 1 + docs/rust.md | 735 ++++++++++++++++++++++++++++++++++++++++ scripts/assets/rust.svg | 3 + 3 files changed, 739 insertions(+) create mode 100644 docs/rust.md create mode 100644 scripts/assets/rust.svg diff --git a/README.md b/README.md index e4fbe9a..b3d5840 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ Quick Reference [Markdown](./docs/markdown.md) [MySQL](./docs/mysql.md) [Python](./docs/python.md) +[Rust](./docs/rust.md) [Swift](./docs/swift.md) [SwiftUI](./docs/swiftui.md) [TOML](./docs/toml.md) diff --git a/docs/rust.md b/docs/rust.md new file mode 100644 index 0000000..f29879e --- /dev/null +++ b/docs/rust.md @@ -0,0 +1,735 @@ +Rust 备忘清单 +==== + +Rust 快速参考备忘单,旨在为编写基本语法和方法提供帮助。 + +入门 +--- + +### Hello_World.rs + +```rust +fn main() { + println!("Hello, World!"); +} +``` +#### 编译运行 + +```shell +$ rustc Hello_World.rs +$ ./Hello_World +Hello, World! +``` + +### 原始类型 + +:-| :- +:-| :- +`bool` | 布尔值 (`true` _/_ `false`) +`char` | 字符 +`f32`, `f64` | 32 位、64 位浮点数 +`i64`, `i32`, `i16`, `i8` | 有符号 16- ... 整数 +`u64`, `u32`, `u16`, `u8` | 无符号 16 位,... 整数 +`isize` | 指针大小的有符号整数 +`usize` | 指针大小的无符号整数 + +查看: [Rust 类型](#rust-类型) + +### Formatting + + +```rust {.wrap} +// 单个占位符 +println!("{}", 1); +// 多个占位符 +println!("{} {}", 1, 3); +// 位置参数 +println!("{0} 是 {1} {2},{0} 也是 {3} 编程语言", "Rust", "cool", "language", "safe"); +// 命名参数 +println!("{country} 是一个团结的国家", country = "China"); +// 占位符特征 :b 表示二进制, :0x 表示十六进制, :o 表示八进制 +println!("让我们打印 76 是二进制的 {:b} ,十六进制等价物是 {:0x} 八进制等价物是 {:o}", 76, 76, 76); +// 调试特征 +println!("使用调试特征 {:?} 在此处打印我们想要的任何内容", (76, 'A', 90)); + +// 1.58 中的新格式字符串 +let x = "world"; +println!("Hello {x}!"); +``` + + +### 打印风格 + +```rust +// 打印输出 +print!("Hello World\n"); +// 打印后追加新行 +println!("追加新行"); +// 打印为错误 +eprint!("这是一个错误\n"); +// 打印为新行错误 +eprintln!("这是新行的错误"); +``` + +### 变量 + +```rust +// 初始化和声明变量 +let some_variable = "This_is_a_variable"; +// 使变量可变 +let mut mutable_variable = "Mutable"; +// 分配多个变量 +let (name, age) = ("ElementalX", 20); +// (全局)常量 +const SCREAMING_SNAKE_CASE:i64 = 9; +``` + +### 注释 + +```rust +// 行注释 +/*.............块注释 */ +/// 外部文档注释 +//! 内部文档评论 +``` + +另见: [注释](https://doc.rust-lang.org/reference/comments.html) _(doc.rust-lang.org)_ + +### 函数 + +```rust +fn test(){ + println!("这是一个函数!"); +} +fn main(){ + test(); +} +``` + +查看: [Functions](#rust-函数) + +Rust 类型 +-------- + +### 整数 + +```rust +let mut a: u32 = 8; +let b: u64 = 877; +let c: i64 = 8999; +let d = -90; +``` + +### 浮点数 + +```rust +let mut sixty_bit_float: f64 = 89.90; +let thirty_two_bit_float: f32 = 7.90; +let just_a_float = 69.69; +``` + +### 布尔值 + +```rust +let true_val: bool = true; +let false_val: bool = false; +let just_a_bool = true; +let is_true = 8 < 5; // => false +``` + +### 字符 + +```rust +let first_letter_of_alphabet = 'a'; +let explicit_char: char = 'F'; +let implicit_char = '8'; +let emoji = "\u{1f600}"; // => 😀 +``` + +### 字符串字面量 + +```rust {.wrap} +let community_name = "AXIAL"; +let no_of_members: &str = "ten"; +println!("社区的名称是 {community_name},它有 {no_of_members} 个成员"); +``` + + +查看: [字符串](#rust-字符串) + +### 数组 + +```rust +┌─────┬─────┬─────┬─────┬─────┬─────┐ +| 92 | 97 | 98 | 99 | 98 | 94 | +└─────┴─────┴─────┴─────┴─────┴─────┘ + 0 1 2 3 4 5 +``` +---- + +```rust +let array: [i64; 6] = [92,97,98,99,98,94]; +``` + +### 多维数组 + + +```rust + j0 j1 j2 j3 j4 j5 + ┌────┬────┬────┬────┬────┬────┐ +i0 | 1 | 2 | 3 | 4 | 5 | 6 | + ├────┼────┼────┼────┼────┼────┤ +i1 | 6 | 5 | 4 | 3 | 2 | 1 | + └────┴────┴────┴────┴────┴────┘ +``` +---- + +```rust +let array: [[i64; 6] ;2] = [ + [1,2,3,4,5,6], + [6,5,4,3,2,1]]; +``` + +### 可变数组 + +```rust +let mut array: [i32 ; 3] = [2,6,10]; +array[1] = 4; +array[2] = 6; +``` + +使用 `mut` 关键字使其可变 + +### 切片 + +```rust +let mut array: [ i64; 4] = [1,2,3,4]; +// 下限包括在内,上限不包括在内 +let mut slices: &[i64] = &array[0..3] +println!("切片的元素是:{slices:?}"); +``` + +### 向量 + +```rust +let some_vector = vec![1,2,3,4,5]; +``` + +使用 `vec!` 宏声明向量 + +### 元组 + +```rust +let tuple = (1, 'A' , "Cool", 78, true); +``` + +Rust 字符串 +-------------- + +### 字符串字面量 + +```rust +let cs:&str = "备忘清单"; +// => 为开发者分享备忘单 +println!("为开发者分享 {cs}"); +``` + +### 字符串对象 + +```rust +// 创建一个空字符串对象 +let my_string = String::new; +// 转换为字符串对象 +let S_string = a_string.to_string() +// 创建一个初始化的字符串对象 +let lang = String::from("Rust"); +println!("First language is {lang}"); + ``` + +### .capacity() + + ```rust +let rand = String::from("Random String"); +rand.capacity() // => 13 +``` + +以字节为单位计算字符串的容量 + +### .contains() + +```rust +let name = String::from("ElementalX"); +name.contains("Element") // => true +``` + +检查子字符串是否包含在原始字符串中 + +### 添加单个字符 + +```rust +let mut half_text = String::from("Hal"); +half_text.push('f'); // => Half +``` + +### 添加整个字符串 + +```rust +let mut hi = String::from("Hey there..."); +hi.push_str("How are you doing??"); +// => Hey there...How are you doing?? +println!("{hi}"); +``` + +Rust 运算符 +----------- + +### 比较运算符 + +:-|:- +:-|:- +`e == f` | `e` 等于 `f` +`e != f` | `e` 不等于 `f` +`e < f` | `e` 小于 `f` +`e > f` | `e` 大于 `f` +`e <= f` | `e` 小于或等于 `f` +`e >= f` | `e` 大于或等于 `f` + +--------- + +```rust +let (e, f) = (1, 100); +let greater = f > e; // => true +let less = f < e; // => false +let greater_equal = f >= e; // => true +let less_equal = e <= f; // => true +let equal_to = e == f; // => false +let not_equal_to = e != f; // => true +``` + +### 算术运算符 + +:-|:- +:-|:- +`a + b` | `a` 被添加到 `b` +`a - b` | 从 `a` 中减去`b` +`a / b` | `a` 除以 `b` +`a % b` | 通过与 `b` 相除得到 `a` 的余数 +`a * b` | `a` 与 `b` 相乘 + +------ + +```rust +let (a, b) = (4, 5); +let sum: i32 = a + b; // => 9 +let subtractions: i32 = a - b; // => -1 +let multiplication: i32 = a * b; // => 20 +let division: i32 = a / b; // => 0 +let modulus: i32 = a % b; // => 4 +``` + +### 位运算符 + +运算符 | 描述 +:- | :- +`g & h` | 二进制与 +`g | h` | 二进制或 +`g ^ h` | 二进制异或 +`g ~ h` | 二进制补码 +`g << h` | 二进制左移 +`g >> h` | 二进制右移 + +----- + +```rust +let (g, h) = (0x1, 0x2); +let bitwise_and = g & h; // => 0 +let bitwise_or = g | h; // => 3 +let bitwise_xor = g ^ h; // => 3 +let right_shift = g >> 2; // => 0 +let left_shift = h << 4; // => 32 +``` + +### 逻辑运算符 + +示例 | 意义 +:- | :- +`c && d` | 两者都是真的_(AND)_ +`c || d` | 要么是真的_(OR)_ +`!c` | `c` 为假 _(NOT)_ + +------ + +```rust +let (c, d) = (true, false); +let and = c && d; // => false +let or = c || d; // => true +let not = !c; // => false +``` + +### 复合赋值运算符 + +```rust +let mut k = 9; +let mut l = k; +``` + +---- + +运算符 | 描述 +:- | :- +`k += l` | 添加一个值并赋值,然后 `k=9` +`k -= l` | `Substrate` 一个值并赋值,然后 `k=18` +`k /= l` | 除以一个值并赋值,然后 `k=9` +`k *= l` | 乘一个值并赋值,然后 `k=81` +`k \|= l` | 按位或并赋值,则 `k=89` + +Rust 流程控制 +------------ + +### If表达式 + +```rust +let case1: i32 = 81; +let case2: i32 = 82; +if case1 < case2 { + println!("case1 大于 case2"); +} +``` + +### If...Else 表达式 + +```rust +let case3 = 8; +let case4 = 9; +if case3 >= case4 { + println!("case3 优于 case4"); +} else { + println!("case4 大于 case3"); +} +``` + +### If...Else...if...Else 表达式 + +```rust +let foo = 12; +let bar = 13; +if foo == bar { + println!("foo 等于 bar"); +} else if foo < bar { + println!("foo 小于 bar"); +} else if foo != bar { + println!("foo 不等于 bar"); +} else { + println!("Nothing"); +} +``` + +### If...let 表达式 + + +```rust +let mut arr1:[i64 ; 3] = [1,2,3]; +if let[1,2,_] = arr1{ + println!("与数组一起使用"); +} +let mut arr2:[&str; 2] = ["one", "two"]; +if let["Apple", _] = arr2{ + println!("也适用于 str 数组"); +} +``` +---- +```rust +let tuple_1 = ("India", 7, 90, 90.432); +if let(_, 7, 9, 78.99) = tuple_1{ + println!("也适用于元组"); +} +let tuple_2 = ( 9, 7, 89, 12, "Okay"); +if let(9, 7,89, 12, blank) = tuple_2 { + println!("一切{blank}伴侣?"); +} +let tuple_3 = (89, 90, "Yes"); +if let(9, 89, "Yes") = tuple_3{ + println!("模式确实匹配"); +} +else { + println!("模式不匹配"); +} +``` + +### 匹配表达式 + + +```rust +let day_of_week = 2; + match day_of_week { + 1 => { + println!("兄弟们今天是星期一"); + }, + 2 => { + println!("兄弟们今天是星期二"); + }, + 3 => { + println!("兄弟们今天是星期三"); + }, + 4 => { + println!("兄弟们今天是星期四"); + }, + 5 => { + println!("兄弟们今天是星期五"); + }, + 6 => { + println!("兄弟们今天是星期六"); + }, + 7 => { + println!("兄弟们今天是星期天"); + }, + _ => { + println!("默认!") + } + }; +} +``` + +### 嵌套...If 表达式 + +```rust +let nested_conditions = 89; +if nested_conditions == 89 { + let just_a_value = 98; + if just_a_value >= 97 { + println!("大于 97"); + } +} +``` + +### For 循环 + +```rust +for mut i in 0..15 { + i-=1; + println!("i 的值为:{i}"); +} +``` + +### While 循环 + +```rust +let mut check = 0; +while check < 11{ + println!("check 是:{check}"); + check+=1; + println!("递增后:{check}"); + if check == 10{ + break; // 停止 while + } +} +``` + +### Loop 关键字 + +```rust +loop { + println!("你好,世界永远!"); +} +``` + +无限循环表示 + +### Break 中断语句 + +```rust +let mut i = 1; +loop { + println!("i 是 {i}"); + if i > 100 { + break; + } + i *= 2; +} +``` + +### Continue 继续声明 + +```rust +for (v, c) in (0..10+1).enumerate(){ + println!("{c} 数字循环"); + if v == 9{ + println!("我们继续?"); + continue; + } + println!{"v 的值为:{v}"}; +} +``` + +Rust 函数 +-------- + +### 基本函数 + +```rust +fn print_message(){ + println!("Hello, Quick Reference!"); +} +fn main(){ + // 在 Rust 中调用函数 + print_message(); +} +``` + +### 按值传递 + +```rust +fn main() +{ + let x:u32 = 10; + let y:u32 = 20; + + // => 200 + println!("计算: {}", cal_rect(x, y)); +} +fn cal_rect(x:u32, y:u32) -> u32 +{ + x * y +} +``` + +### 通过引用传递 + +```rust +fn main(){ + let mut by_ref = 3; // => 3 + power_of_three(&mut by_ref); + println!("{by_ref}"); // => 9 +} +fn power_of_three(by_ref: &mut i32){ + // 取消引用很重要 + *by_ref = *by_ref * *by_ref; + println!("{by_ref}"); // => 9 +} +``` + +### 返回 + +```rust +fn main(){ + let (mut radius, mut pi) = (3.0, 3.14); + let(area, _perimeter) = calculate ( + &mut radius, + &mut pi + ); + println!("圆的面积和周长为:{area} & {_perimeter}"); +} +fn calculate(radius : &mut f64, pi: &mut f64) -> (f64, f64){ + let perimeter = 2.0 * *pi * *radius; + let area = *pi * *radius * *radius; + return (area, perimeter); +} +``` + + +### 数组作为参数 + +```rust +fn main(){ + let mut array: [i32 ; 5] = [1,2,3,4,6]; + print_arrays(array); + println!("元素:{array:?}"); +} +fn print_arrays(mut array:[i32; 5]) { + array[0] = 89; + array[1] = 90; + array[2] = 91; + array[3] = 92; + array[4] = 93; + println!("元素:{array:?}"); +} +``` + +### 返回数组 + +```rust +fn main(){ + let mut arr:[i32; 5] = [2,4,6,8,10]; + multiply(arr); + println!("数组是:{:?}", multiply(arr)); +} +fn multiply (mut arr: [i32 ; 5]) -> [i32 ; 5]{ + arr[2] = 90; + for mut i in 0..5 { + arr[i] = arr[i] * arr[2]; + } + return arr; +} +``` + + +杂项 +----- + +### 类型断言 type-casting + +```rust +let a_int = 90; // int +// int 到 float +let mut type_cast = (a_int as f64); +``` +------ +```rust +let orginal: char = 'I'; +// char 到 int => 73 +let type_casted: i64 = orginal as i64; +``` + +要在 `Rust` 中执行类型转换,必须使用 `as` 关键字 + +### 借用 + +```rust +let mut foo = 4; +let mut borrowed_foo = &foo; +println!("{borrowed_foo}"); +``` +------ +```rust +let mut bar = 3; +let mut mutable_borrowed_bar = &mut bar; +println!("{mutable_borrowed_bar}"); +``` + +这里借用的值使用 `&` 运算符从值一中借用值 + +### 取消引用 + +```rust +let mut borrow = 10; +let deref = &mut borrow; +println!("{}", *deref); +``` + +可以使用 `*` 操作符在 rust 中取消引用 + +### 变量范围 + +```rust +{ + // 范围仅限于此大括号 + let a_number = 1; +} +println!("{a_number}"); +``` + +这将产生错误,因为变量 `a_number` 的范围在大括号处结束 + + +另见 +-------- + +- [The Rust Document](https://doc.rust-lang.org/book/ch00-00-introduction.html) _(doc.rust-lang.org)_ +- [The Rust Reference](https://doc.rust-lang.org/reference/introduction.html) _(doc.rust-lang.org)_ +- [Rust Cheatsheet](https://phaiax.github.io/rust-cheatsheet/) _(phaiax.github.io)_ +- [Rust 标准库文档中文版](https://jaywcjlove.github.io/rust-cn-document-for-docker/std/std/) _(jaywcjlove.github.io)_ +- [Rust 程序设计语言 中文版](https://jaywcjlove.github.io/rust-cn-document-for-docker/book/) _(jaywcjlove.github.io)_ +- [Rust By Example 中文版](https://jaywcjlove.github.io/rust-cn-document-for-docker/rust-by-example-cn/) _(jaywcjlove.github.io)_ +- [Rust 参考手册中文版](https://jaywcjlove.github.io/rust-cn-document-for-docker/reference/) _(jaywcjlove.github.io)_ +- [RustDoc 手册中文版](https://jaywcjlove.github.io/rust-cn-document-for-docker/rustdoc/) _(jaywcjlove.github.io)_ +- [Rust Cookbook 中文版](https://jaywcjlove.github.io/rust-cn-document-for-docker/rust-cookbook/) _(jaywcjlove.github.io)_ \ No newline at end of file diff --git a/scripts/assets/rust.svg b/scripts/assets/rust.svg new file mode 100644 index 0000000..3956ac0 --- /dev/null +++ b/scripts/assets/rust.svg @@ -0,0 +1,3 @@ + + +