Merge pull request #1047 from ansel-peng/main

perf: basic 数组模块知识,对于数组元素为非基础类型
pull/1082/head
Sunface 2 years ago committed by GitHub
commit 1a22de4e74
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -111,6 +111,48 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
这种就是 Rust 的安全特性之一。在很多系统编程语言中,并不会检查数组越界问题,你会访问到无效的内存地址获取到一个风马牛不相及的值,最终导致在程序逻辑上出现大问题,而且这种问题会非常难以检查。
#### 数组元素为非基础类型
学习了上面的知识很多朋友肯定觉得已经学会了Rust的数组类型但现实会给我们一记重锤实际开发中还会碰到一种情况就是**数组元素是非基本类型**的,这时候大家一定会这样写。
```rust
let array = [String::from("rust is good!"); 8];
println!("{:#?}", array);
```
然后你会惊喜的得到编译错误。
```console
error[E0277]: the trait bound `String: std::marker::Copy` is not satisfied
--> src/main.rs:7:18
|
7 | let array = [String::from("rust is good!"); 8];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `String`
|
= 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出来的但很可惜复杂类型都没有深拷贝只能一个个创建。
接着就有小伙伴会这样写。
```rust
let array = [String::from("rust is good!"),String::from("rust is good!"),String::from("rust is good!")];
println!("{:#?}", array);
```
作为一个追求极致完美的Rust开发者怎么能容忍上面这么难看的代码存在
**正确的写法**,应该调用`std::array::from_fn`
```rust
let array: [String; 8] = core::array::from_fn(|i| String::from("rust is good!"));
println!("{:#?}", array);
```
## 数组切片
在之前的[章节](https://course.rs/basic/compound-type/string-slice.html#切片slice),我们有讲到 `切片` 这个概念,它允许你引用集合中的部分连续片段,而不是整个集合,对于数组也是,数组切片允许我们引用数组的一部分:

Loading…
Cancel
Save