2014-12-18 4 views
5

Я часто получаю сообщение об ошибке, как это:В чем разница между Vec <struct> и & [struct]?

mismatched types: expected `collections::vec::Vec<u8>`, found `&[u8]` (expected struct collections::vec::Vec, found &-ptr) 

Насколько я знаю, один изменчиво и один не но я понятия не имею, как идти между типами, то есть взять &[u8] и сделайте его Vec<u8> или наоборот.

В чем разница между ними? Это то же самое, что и String и &str?

ответ

5

Это то же самое, что и String и &str?

Да. A Vec<T> является собственником варианта &[T]. &[T] - ссылка на набор T s, выложенный последовательно в памяти (a.k.a. a фрагмент). Он представляет собой указатель на начало элементов и количество элементов. Ссылка ссылается на то, что у вас нет, поэтому набор действий, которые вы можете сделать с ним, ограничен. Существует измененный вариант (&mut [T]), который позволяет вам мутировать элементы в срезе. Тем не менее, вы не можете изменить количество участников. С другой стороны, вы не можете мутировать сам срез.

взять &[u8] и сделать его Vec

Для этот конкретный случай:

let s: &[u8]; // Set this somewhere 
Vec::from(s); 

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

или наоборот

let v = vec![1u8, 2, 3]; 
let s = v.as_slice(); 

В основном это «бесплатно» в качестве v до сих пор владеет данные, мы просто раздавать ссылку на него. Вот почему многие API пытаются использовать срезы, когда это имеет смысл.