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

fab*_*iim 3 slice rust

如果我试试这个:

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

Fre*_*ios 5

[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)

也可以看看: