|
|
|
@ -113,7 +113,7 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
|
|
|
|
|
|
|
|
|
|
#### 数组元素为非基础类型
|
|
|
|
|
|
|
|
|
|
学习了上面的知识,很多朋友肯定觉得已经学会了Rust的数组类型,但现实会给我们一记重锤,实际开发中还会碰到一种情况,就是**数组元素是非基本类型**的,这时候大家一定会这样写。
|
|
|
|
|
学习了上面的知识,很多朋友肯定觉得已经学会了 Rust 的数组类型,但现实会给我们一记重锤,实际开发中还会碰到一种情况,就是**数组元素是非基本类型**的,这时候大家一定会这样写。
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
let array = [String::from("rust is good!"); 8];
|
|
|
|
@ -133,7 +133,7 @@ error[E0277]: the trait bound `String: std::marker::Copy` is not satisfied
|
|
|
|
|
= note: the `Copy` trait is required because this value will be copied for each element of the array
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
有些还没有看过特征的小伙伴,有可能不太明白这个报错,不过这个目前可以不提,我们就拿之前所学的[所有权](https://course.rs/basic/ownership/ownership.html)知识,就可以思考明白,前面几个例子都是Rust的基本类型,而**基本类型在Rust中赋值是以Copy的形式**,这时候你就懂了吧,`let array=[3;5]`底层就是不断的Copy出来的,但很可惜复杂类型都没有深拷贝,只能一个个创建。
|
|
|
|
|
有些还没有看过特征的小伙伴,有可能不太明白这个报错,不过这个目前可以不提,我们就拿之前所学的[所有权](https://course.rs/basic/ownership/ownership.html)知识,就可以思考明白,前面几个例子都是 Rust 的基本类型,而**基本类型在 Rust 中赋值是以 Copy 的形式**,这时候你就懂了吧,`let array=[3;5]`底层就是不断的Copy出来的,但很可惜复杂类型都没有深拷贝,只能一个个创建。
|
|
|
|
|
|
|
|
|
|
接着就有小伙伴会这样写。
|
|
|
|
|
|
|
|
|
@ -169,7 +169,7 @@ assert_eq!(slice, &[2, 3]);
|
|
|
|
|
|
|
|
|
|
- 切片的长度可以与数组不同,并不是固定的,而是取决于你使用时指定的起始和结束位置
|
|
|
|
|
- 创建切片的代价非常小,因为切片只是针对底层数组的一个引用
|
|
|
|
|
- 切片类型[T]拥有不固定的大小,而切片引用类型&[T]则具有固定的大小,因为 Rust 很多时候都需要固定大小数据类型,因此&[T]更有用,`&str`字符串切片也同理
|
|
|
|
|
- 切片类型 [T] 拥有不固定的大小,而切片引用类型 &[T] 则具有固定的大小,因为 Rust 很多时候都需要固定大小数据类型,因此 &[T] 更有用,`&str` 字符串切片也同理
|
|
|
|
|
|
|
|
|
|
## 总结
|
|
|
|
|
|
|
|
|
@ -208,7 +208,7 @@ fn main() {
|
|
|
|
|
|
|
|
|
|
做个总结,数组虽然很简单,但是其实还是存在几个要注意的点:
|
|
|
|
|
|
|
|
|
|
- **数组类型容易跟数组切片混淆**,[T;n]描述了一个数组的类型,而[T]描述了切片的类型, 因为切片是运行期的数据结构,它的长度无法在编译期得知,因此不能用[T;n]的形式去描述
|
|
|
|
|
- **数组类型容易跟数组切片混淆**,[T;n] 描述了一个数组的类型,而 [T] 描述了切片的类型, 因为切片是运行期的数据结构,它的长度无法在编译期得知,因此不能用 [T;n] 的形式去描述
|
|
|
|
|
- `[u8; 3]`和`[u8; 4]`是不同的类型,数组的长度也是类型的一部分
|
|
|
|
|
- **在实际开发中,使用最多的是数组切片[T]**,我们往往通过引用的方式去使用`&[T]`,因为后者有固定的类型大小
|
|
|
|
|
|
|
|
|
|