Возможно ли иметь не заимствованный срез? - PullRequest
0 голосов
/ 28 апреля 2018

Если я попробую это:

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 голосов
/ 28 апреля 2018

Срез без заимствования ([T]) существует, но вы не можете использовать его как значение как есть. Это полезно только в других типах, где оно находится за указателем некоторого вида. Например (не исчерпывающий):

  • В заимствованных ломтиках: &[T]
  • В коробочных ломтиках (, т.е. принадлежащих ломтикам): Box<[T]>
  • В пересчитанных срезах: Rc<[T]>

Это потому, что компилятор не может знать, каков размер нестандартного типа в стеке, но указатель имеет известный размер.

Тип также может использоваться как часть признака, привязанного к статическому полиморфизму: U: AsRef<[T]>.

Кажется немного странным требовать этот синтаксис &vector[], если на самом деле всегда требуется заимствование (&).

Не всегда требуется использовать & с синтаксическим индексированием, потому что иногда ссылочное значение может быть разыменовано :

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

Смотри также:

...