如果我试试这个:
let vector = vec![1, 2, 3];
let slice = vector[1..2];
我收到编译错误:
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
我认为我们需要let slice = &vector[1..2]
,正如编译器所建议的那样。这是有道理的:切片始终来自另一个值,因此您需要在此示例中借用向量。
然而,我试过这个:
let vector = vec![1, 2, 3];
let borrowed_vector = &vector;
let slice = borrowed_vector[1..2];
我又回到了同样的错误。
我问,因为要求&vector[]
语法似乎有点奇怪,实际上总是需要借用(&
)。
答案 0 :(得分:5)
存在非借用片(vertexAttribDivisorANGLE()
),但您不能将其用作原样值。它仅适用于其他类型的指针。例如(不详尽):
[T]
&[T]
Box<[T]>
这是因为编译器无法知道堆栈上的unsized类型的大小,但指针的大小已知。
该类型也可以用作静态多态性的特征的一部分:Rc<[T]>
。
如果实际上总是需要借用(
U: AsRef<[T]>
),那么要求使用这种语法&vector[]
似乎有点奇怪。
并非总是需要使用带有索引语法的&
,因为sometimes the referenced value can be dereferenced:
&
另见: