是否有可能有一个非借用的片?

时间:2018-04-28 16:08:13

标签: rust slice

如果我试试这个:

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[]语法似乎有点奇怪,实际上总是需要借用(&)。

1 个答案:

答案 0 :(得分:5)

存在非借用片(vertexAttribDivisorANGLE()),但您不能将其用作原样值。它仅适用于其他类型的指针。例如(不详尽):

  • 借来的切片:[T]
  • 在盒装切片中(拥有的切片):&[T]
  • 在重新计算的切片中:Box<[T]>

这是因为编译器无法知道堆栈上的unsized类型的大小,但指针的大小已知。

该类型也可以用作静态多态性的特征的一部分:Rc<[T]>

  

如果实际上总是需要借用(U: AsRef<[T]>),那么要求使用这种语法&vector[]似乎有点奇怪。

并非总是需要使用带有索引语法的&,因为sometimes the referenced value can be dereferenced

&

另见: