diff --git a/docs/rust.md b/docs/rust.md index 75ec7c1..0cc7799 100644 --- a/docs/rust.md +++ b/docs/rust.md @@ -143,25 +143,30 @@ foo!(3); ### 结构体 +结构体是一个使用关键字 `struct` 定义的标称型(nominal)结构体类型 + ```rust struct Point { x: i32, y: i32 } let p = Point { x: 10, y: 11 }; let px: i32 = p.x; ``` -结构体是一个使用关键字 `struct` 定义的标称型(nominal)结构体类型 - -### 枚举 +#### 元祖结构体 ```rust -enum Foo { - Bar, // 0 - Baz = 123, // 123 - Quux, // 124 -} +struct Color (i32, i32, i32); +let black = Color(0,0,0); +``` -let baz_discriminant = Foo::Baz as u32; -assert_eq!(baz_discriminant, 123); +#### 单元结构体 + +不关心该类型的内容, 只关心它的行为。 + +```rust +struct Solution; +impl Solution{ + // ... +} ``` ### 语句与表达式 @@ -246,6 +251,9 @@ println!("社区的名称是 {community_name},它有 {no_of_members} 个成员 查看: [字符串](#rust-字符串) ### 数组 + + +这里介绍的是固定长度的数组。rust 中常用的是集合类型 vec 表示的[动态数组](#rust-动态数组) ```rust ┌─────┬─────┬─────┬─────┬─────┬─────┐ @@ -260,28 +268,8 @@ println!("社区的名称是 {community_name},它有 {no_of_members} 个成员 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; @@ -299,14 +287,6 @@ let mut slices: &[i64] = &array[0..3] println!("切片的元素是:{slices:?}"); ``` -### 向量 - -```rust -let some_vector = vec![1,2,3,4,5]; -``` - -使用 `vec!` 宏声明向量 - ### 元组 ```rust @@ -397,8 +377,68 @@ println!("{:?}", str4); Rust 动态数组 ----------- +### 创建动态数组 + +```rust +let v: Vec = Vec::new(); +// 使用宏 +let v1 = vec![1, 2, 3]; +``` + +### 读取元素 + +```rust +let v = vec![1, 2, 3, 4, 5]; + +let element = &v[100]; +// panic,越界 +let element2 = v.get(100); +println!("{:?}", element2); +//None +``` + +### 遍历数组 + +1. 只读取数组中的元素 + + ```rust + let v = vec![1, 2, 3]; + for i in &v { + println!("{}", i); + } + ``` + +2. 遍历的同时修改数组中的元素 + + ```rust + let mut v = vec![1, 2, 3]; + for i in &mut v { + *i += 10 + } + ``` + +### 多维数组 + +```rust + j0 j1 j2 j3 j4 j5 + ┌────┬────┬────┬────┬────┬────┐ +i0 | 1 | 2 | 3 | 4 | 5 | 6 | + ├────┼────┼────┼────┼────┼────┤ +i1 | 6 | 5 | 4 | 3 | 2 | 1 | + └────┴────┴────┴────┴────┴────┘ +``` + +---- + +```rust +let arr = vec![ + vec![1, 2, 3, 4, 5, 6], + vec![6, 5, 4, 3, 2, 1] +]; +``` + ### 常用方法 - + -|:- -|:- @@ -415,43 +455,84 @@ Rust 动态数组 `drain(range)` | 删除 `vec` 中指定范围的元素,同时返回一个迭代该范围所有元素的迭代器 `split_off(index)` | 切分 `vec`,索引左边的元素保留在原 `vec` 中(含索引),索引右边的元素(不含索引)在返回的 `vec` 中 -### 创建动态数组 +枚举 +-------- + +### 在结构体中使用枚举 ```rust -let v: Vec = Vec::new(); -// 使用宏 -let v1 = vec![1, 2, 3]; -``` +enum IpAddrKind { + V4, + V6, +} +struct IpAddr { + kind: IpAddrKind, + address: String, +} -### 遍历数组 - -只读取数组中的元素 - -```rust -let v = vec![1, 2, 3]; -for i in &v { - println!("{}", i); +fn main(){ + let ip = IpAddr{ + kind: IpAddrKind::V4, + address: String::from("127.0.0.1") + }; } ``` -遍历的同时修改数组中的元素 +### 枚举的变体 ```rust -let mut v = vec![1, 2, 3]; -for i in &mut v { - *i += 10 +enum IpAddrKind { + V4(u8, u8, u8, u8), + V6(String), +} + +fn main() { + let home = IpAddrKind::V4(127, 0, 0, 1); + let loopback = IpAddrKind::V6(String::from("::1")); } ``` -### 读取元素 +---- ```rust -let v = vec![1, 2, 3, 4, 5]; -let element = &v[100]; -// panic,越界 -let element2 = v.get(100); -println!("{:?}", element2); -//None +enum Message{ + Quit, + Move {x:i32, y:i32}, + Write(String), + ChangeColor(i32, i32, i32), +} +fn main(){ + let q = Message::Quit; + let m = Message::Move {x:10, y:20}; + let w = Message:: Write(String::from("hello")); + let c = Message::ChangeColor(10, 20, 30); +} +``` + +### 模式匹配结构体 + +```rust +#[derive(Debug)] +enum Grade { + A, + B, + C, +} +enum Subject { + Math(Grade), + English(Grade), +} + +fn subject_grade(sub: Subject) { + match sub { + Subject::Math(grade) => println!("The Math is {:?}", grade), + Subject::English(grade) => println!("The Math is {:?}", grade), + } +} + +fn main() { + subject_grade(Subject::Math(Grade::A)); +} ``` Rust 运算符 @@ -527,8 +608,8 @@ let left_shift = h << 4; // => 32 示例 | 意义 :- | :- -`c && d` | 两者都是真的 _(AND)_ -`c \|\| d` | 要么是真的 _(OR)_ +`c && d` | 两者都是真的_(AND)_ +`c || d` | 要么是真的_(OR)_ `!c` | `c` 为假 _(NOT)_ ---- @@ -754,15 +835,15 @@ fn main(){ ```rust struct Point { - x: i32, - y: i32, - z: i32, + x: i32, + y: i32, + z: i32, } let origin = Point { x: 0, y: 0, z: 0 }; match origin { - Point { x, .. } => println!("x is {}", x), + Point { x, .. } => println!("x is {}", x), } ``` @@ -772,9 +853,9 @@ match origin { let hello = ('h', 'e', 'l', 'l', 'o'); match hello { - (h, _, _, l, o) => { - println!("char: {}, {}, {}", h, l, o) - }, + (h, _, _, l, o) => { + println!("char: {}, {}, {}", h, l, o) + }, } ``` @@ -785,9 +866,9 @@ match hello { ```rust let x = Some(10); match x { - Some(1) => println!("x = 1"), - Some(y) => println!("y = {:?}", y), - _ => println!("None"), + Some(1) => println!("x = 1"), + Some(y) => println!("y = {:?}", y), + _ => println!("None"), }// y = 10 ``` @@ -799,27 +880,25 @@ match x { ```rust let grade = 'A'; match grade { - good @ 'A'..='C' => println!("your grade is {}", good), - _ => println!("Come on"), + good @ 'A'..='C' => println!("your grade is {}", good), + _ => println!("Come on"), } ``` - ---- ```rust #[derive(Debug)] struct Point { - x: i32, - y: i32, + x: i32, + y: i32, } fn main(){ - let p @ Point {x: px, y: py } = Point {x: 10, y: 23}; - println!("x: {}, y: {}", px, py); - println!("{:?}", p); + let p @ Point {x: px, y: py } = Point {x: 10, y: 23}; + println!("x: {}, y: {}", px, py); + println!("{:?}", p); } ``` - ---- @@ -827,10 +906,10 @@ fn main(){ ```rust match 1 { - num @ (1 | 2) => { - println!("{}", num); - } - _ => {} + num @ (1 | 2) => { + println!("{}", num); + } + _ => {} } ``` @@ -839,12 +918,11 @@ match 1 { ```rust let x = Some(2); match x { - Some(1) => println!("x = 1"), - Some(y) if y == 2 => println!("y = {:?}", y), - _ => println!("No match"), + Some(1) => println!("x = 1"), + Some(y) if y == 2 => println!("y = {:?}", y), + _ => println!("No match"), }// y = 2 ``` - Rust 函数 -------- @@ -860,23 +938,21 @@ fn print_message(){ ``` ### 参数值 - rust 需要为函数的参数标明确定的类型 ```rust fn another_fn(a:u8, b: &str){ - println!("我是 u8:{}", a); - println!("我是 &str:{}", b); + println!("我是 u8:{}", a); + println!("我是 &str:{}", b); } fn main(){ - another_fn(10, "hello") + another_fn(10, "hello") } ``` ### 返回值 - 如果不指定返回值,rust 默认返回 `()` 类型 @@ -885,14 +961,16 @@ fn main(){ fn main(){} ``` -使用 `->` 指定返回值,如果**表达式**在最后一行,无需使用 `return` +---- + +使用 `->` 指定返回值,如果**表达式**在最后一行,无需使用 return ```rust fn add(a:i32, b:i32) -> i32 { - if a + b < 100 { - return a - b; - } - a + b + if a + b < 100 { + return a - b; + } + a + b } ```