|
|
@ -1,11 +1,11 @@
|
|
|
|
# 结构体
|
|
|
|
# 结构体
|
|
|
|
|
|
|
|
|
|
|
|
上一节中提到需要一个更高级的数据结构来帮助我们更好的抽象问题,结构体`strct`恰恰就是这样的复合数据结构,它是由其它数据类型组合而来。 其它语言也有类似的数据结构,不过可能有不同的名称,例如`object`、`record`等。
|
|
|
|
上一节中提到需要一个更高级的数据结构来帮助我们更好的抽象问题,结构体`struct`恰恰就是这样的复合数据结构,它是由其它数据类型组合而来。 其它语言也有类似的数据结构,不过可能有不同的名称,例如`object`、`record`等。
|
|
|
|
|
|
|
|
|
|
|
|
结构体跟之前讲过的[元组](./tuple.md)有些相像:都是由多种类型组合而成。但是与元组不同的是,结构体可以为内部的每个字段起一个富有含义的名称。因此结构体更加灵活更加强大,你无需依赖这些字段的顺序来访问和解析它们。
|
|
|
|
结构体跟之前讲过的[元组](./tuple.md)有些相像:都是由多种类型组合而成。但是与元组不同的是,结构体可以为内部的每个字段起一个富有含义的名称。因此结构体更加灵活更加强大,你无需依赖这些字段的顺序来访问和解析它们。
|
|
|
|
|
|
|
|
|
|
|
|
## 结构体语法
|
|
|
|
## 结构体语法
|
|
|
|
天下无敌的剑士往往也因为他有一炳无双之剑,既然结构体这么强大,那么我们就需要给它配套一套强大的语法,让用户能更好的驾驭。
|
|
|
|
天下无敌的剑士往往也因为他有一柄无双之剑,既然结构体这么强大,那么我们就需要给它配套一套强大的语法,让用户能更好的驾驭。
|
|
|
|
|
|
|
|
|
|
|
|
#### 定义结构体
|
|
|
|
#### 定义结构体
|
|
|
|
一个结构体有几部分组成:
|
|
|
|
一个结构体有几部分组成:
|
|
|
@ -107,7 +107,7 @@ fn build_user(email: String, username: String) -> User {
|
|
|
|
> 仔细回想一下[所有权](../ownership/ownership.md#拷贝(浅拷贝))那一节的内容,我们提到了Copy特征:实现了Copy特征的类型无需所有权转移,可以直接在赋值时进行
|
|
|
|
> 仔细回想一下[所有权](../ownership/ownership.md#拷贝(浅拷贝))那一节的内容,我们提到了Copy特征:实现了Copy特征的类型无需所有权转移,可以直接在赋值时进行
|
|
|
|
> 数据拷贝,其中`bool`和`u64`类型就实现了`Copy`特征,因此`active`和`sign_in_count`字段在赋值给user2时,仅仅发生了拷贝,而不是所有权转移.
|
|
|
|
> 数据拷贝,其中`bool`和`u64`类型就实现了`Copy`特征,因此`active`和`sign_in_count`字段在赋值给user2时,仅仅发生了拷贝,而不是所有权转移.
|
|
|
|
>
|
|
|
|
>
|
|
|
|
> 值的注意的是:`username`所有权被转移给了`user2`,导致了`user1`无法再被使用,但是并不代表`user1`内部的字段不能被继续使用,例如:
|
|
|
|
> 值的注意的是:`username`所有权被转移给了`user2`,导致了`user1`无法再被使用,但是并不代表`user1`内部的其它字段不能被继续使用,例如:
|
|
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
```rust
|
|
|
|
let user1 = User {
|
|
|
|
let user1 = User {
|
|
|
|