如果我试试这个:
let vector = vec![1, 2, 3];
let slice = vector[1..2];
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误:
error[E0277]: the trait bound `[{integer}]: std::marker::Sized` is not satisfied
--> src/main.rs:3:9
|
3 | let slice = vector[1..2];
| ^^^^^ ------------ help: consider borrowing here: `&vector[1..2]`
| |
| `[{integer}]` does not have a constant size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for `[{integer}]`
= note: all local variables must have a statically known size
Run Code Online (Sandbox Code Playgroud)
我得到了我们需要的,let slice = &vector[1..2]正如编译器所建议的那样.这是有道理的:切片总是来自另一个值,因此您需要在此示例中借用向量.
但是,我试过这个:
let vector = vec![1, 2, 3];
let borrowed_vector = &vector;
let slice = borrowed_vector[1..2];
Run Code Online (Sandbox Code Playgroud)
我又回到了同样的错误.
我问,因为要求&vector[]语法似乎有点奇怪,实际上&总是需要借用().
[T]存在非借用的slice(),但您不能将其用作值原样.它仅适用于其他类型的指针.例如(不详尽):
&[T]Box<[T]>Rc<[T]>这是因为编译器无法知道堆栈上的unsized类型的大小,但指针具有已知大小.
该类型也可以用作静态多态性的特征的一部分:U: AsRef<[T]>.
&vector[]如果实际上&总是需要借用(),那么要求这种语法似乎有点奇怪.
并不总是需要使用&索引语法,因为有时可以取消引用引用的值:
let scores = vec![1, 2, 3];
let score = scores[0];
Run Code Online (Sandbox Code Playgroud)
也可以看看:
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |