Это то же самое, что и 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 пытаются использовать срезы, когда это имеет смысл.