有没有可能拥有一个非借用的切片?

3
如果我尝试这样做:
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个回答

6
存在非借用的切片([T]),但你不能直接将其作为值使用。它只在其他类型中有用,在这些类型中,它位于某种指针后面。例如(不全):
- 在借用切片中:&[T] - 在盒式切片中(即所拥有的切片):Box<[T]> - 在引用计数切片中:Rc<[T]> 这是因为编译器无法知道堆栈上未定大小类型的大小,但是指针具有已知大小。
该类型也可以用作静态多态性的特征绑定的一部分:U: AsRef<[T]>

如果实际上总是需要借用(&),那么需要这种语法 &vector[] 似乎有点奇怪。

并不总是需要在索引语法中使用 &,因为有时可以对引用的值进行解引用
let scores = vec![1, 2, 3];
let score = scores[0];

另请参阅:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接