2014-12-18 13 views
5

I często znajduję się coraz błąd tak:Jaka jest różnica między Vec <struct> a & [struct]?

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

O ile mi wiadomo, jedno jest zmienny i nie jest, ale nie mam pojęcia, jak się do tego między typami, czyli wziąć &[u8] i sprawiają, że jest to Vec<u8> lub odwrotnie.

Czym różnią się między sobą? Czy to jest to samo, co String i &str?

Odpowiedz

5

Czy to samo co String i &str?

Tak. A Vec<T> jest własnością wariantu &[T]. &[T] jest numerem referencyjnym odniesienia do zestawu T rozmieszczonymi sekwencyjnie w pamięci (a.k.a. wycinek). Reprezentuje wskaźnik do początku elementów i liczby elementów. Odwołanie odnosi się do czegoś, co nie należy do Ciebie, więc zestaw działań, które możesz z nim zrobić, jest ograniczony. Istnieje wariant zmienny (&mut [T]), który umożliwia mutowanie elementów w plasterku. Nie można zmienić liczby w plasterku. Mówiąc inaczej, nie możesz zmutować samego plastra.

wziąć &[u8] i uczynić z niego Vec

Dla ten konkretny przypadek:

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

Jednak to musi przydzielić pamięć nie na stosie, a następnie kopiowania każdą wartość do tej pamięci. Jest droższy niż w inny sposób, ale może być odpowiedni dla danej sytuacji.

lub odwrotnie

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

Jest to w zasadzie "free", jak v nadal posiada dane, jesteśmy po prostu rozdawać odniesienie do niej. Dlatego wiele interfejsów API próbuje robić plasterki, gdy ma to sens.