【问题标题】:Is it possible to have a non-borrowed slice?是否有可能有一个非借来的切片?
【发布时间】:2018-10-09 05:58:17
【问题描述】:

如果我试试这个:

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[] 语法似乎有点奇怪。

【问题讨论】:

    标签: rust slice


    【解决方案1】:

    存在非借用切片 ([T]),但您不能按原样将其用作值。它仅在它位于某种指针后面的其他类型中有用。例如(不详尽):

    • 在借来的切片中:&[T]
    • 在盒装切片中(拥有的切片):Box<[T]>
    • 在引用计数的切片中:Rc<[T]>

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

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

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

    并不总是需要在索引语法中使用&,因为sometimes the referenced value can be dereferenced

    let scores = vec![1, 2, 3];
    let score = scores[0];
    

    另见:

    【讨论】:

      猜你喜欢
      • 2014-10-20
      • 2011-09-20
      • 2013-06-09
      • 2015-01-23
      • 2018-04-15
      • 2019-06-22
      • 2020-10-19
      • 2017-11-24
      • 2021-03-19
      相关资源
      最近更新 更多