Skip to content

Commit

Permalink
2024年02月19日 23:35:34
Browse files Browse the repository at this point in the history
  • Loading branch information
Liubasara committed Feb 19, 2024
1 parent ac0c987 commit 4c34caf
Showing 1 changed file with 173 additions and 2 deletions.
175 changes: 173 additions & 2 deletions 技术/学习笔记/RustCourse/《RustCourse》学习笔记(5).md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: 《RustCourse》学习笔记(5)
title: 《RustCourse》学习笔记(5)
tags: ["技术","学习笔记","RustCourse"]
categories: 学习笔记
info: "第2章 Rust基本概念 2.4 复合类型 2.4.2 元组"
info: "第2章 Rust基本概念 2.4 复合类型 2.4.2 元组 2.4.3 结构体"
time: 2024/2/18
desc: 'RustCourse, 学习笔记'
keywords: ['RustCourse', '学习笔记', 'rust']
Expand All @@ -29,7 +29,7 @@ fn main() {
}
```

##### 2.4.2.1 用模式匹配解构元组
##### 2.4.2.1/2.4.2.2/2.4.2.3 用模式匹配解构元组/用.来访问元组/元组的使用示例

```rust
fn main() {
Expand All @@ -40,6 +40,177 @@ fn main() {
println!("The value of y is: {}", y);
}
```

和其它语言的数组、字符串一样,元组的索引从 0 开始,可以直接用`.`来访问

```rust
fn main() {
let x: (i32, f64, u8) = (500, 6.4, 1);

let five_hundred = x.0;

let six_point_four = x.1;

let one = x.2;
}
```

元组在函数返回值场景很常用,例如下面的代码,可以使用元组返回多个值。

```rust
fn main() {
let s1 = String::from("hello");

let (s2, len) = calculate_length(s1);

println!("The length of '{}' is {}.", s2, len);
}

fn calculate_length(s: String) -> (String, usize) {
let length = s.len(); // len() 返回字符串的长度

(s, length)
}
```

> 有一个说法,`()`作为类型,是0个元素的Tuple,这种类型的值只有一个,恰好也是`()`
#### 2.4.3 结构体

结构体`struct`是一种复合数据结构,其他语言也有类似的数据结构,比如`object``record`等等。

##### 2.4.3.1 结构体语法

一个结构体由几部分组成:

- 通过关键字`struct`定义
- 一个清晰明确的结构体`名称`
- 几个有名字的结构体`字段`

比如下面的结构体:

```rust
// 该结构体名称是 User,拥有 4 个字段,且每个字段都有对应的字段名及类型声明,例如 username 代表了用户名,是一个可变的 String 类型。
struct User {
active: bool,
username: String,
email: String,
sign_in_count: u64,
}

// 创建结构体示例:
let user1 = User {
email: String::from("[email protected]"),
username: String::from("someusername123"),
active: true,
sign_in_count: 1,
};
```

> 注意:
>
> 1. 初始化实例时,**每个字段**都需要进行初始化
> 2. 初始化时的字段顺序**不需要**和结构体定义时的顺序一致
通过`.`操作符即可访问结构体内部的字段值和修改他们。

```rust
let mut user1 = User {
email: String::from("[email protected]"),
username: String::from("someusername123"),
active: true,
sign_in_count: 1,
};

user1.email = String::from("[email protected]");
```

> 注意:必须要将结构体实例声明为可变的,才能修改其中的字段,Rust 不支持将某个结构体某个字段标记为可变。


**简化结构体创建**,酷似 TypeScript:

```rust
fn build_user(email: String, username: String) -> User {
User {
email,
username,
active: true,
sign_in_count: 1,
}
}
```



**结构体更新语法**

根据已有的结构体实例,创建新的结构体实例:

```rust
let user2 = User {
active: user1.active,
username: user1.username,
email: String::from("[email protected]"),
sign_in_count: user1.sign_in_count,
};

// 或者可以用另一种方法

/**
因为 user2 仅仅在 email 上与 user1 不同,因此我们只需要对 email 进行赋值,剩下的通过结构体更新语法 ..user1 即可完成。
.. 语法表明凡是我们没有显式声明的字段,全部从 user1 中自动获取。需要注意的是 ..user1 必须在结构体的尾部使用。
*/
let user2 = User {
email: String::from("[email protected]"),
..user1
};
```

**注意:上面的代码中,`user1`结构体的`username`字段和`email`字段的所有权被转移了,因此,`user1`结构体实例的这两个字段不能被继续使用了**

```rust
let user1 = User {
email: String::from("[email protected]"),
username: String::from("someusername123"),
active: true,
sign_in_count: 1,
};
let user2 = User {
active: user1.active,
username: user1.username,
email: String::from("[email protected]"),
sign_in_count: user1.sign_in_count,
};
println!("{}", user1.active);
// 下面这行会报错
println!("{:?}", user1);
```



##### 2.4.3.2 结构体的内存排列























Expand Down

0 comments on commit 4c34caf

Please sign in to comment.