2014-12-18 23 views
5

Tôi thường thấy mình nhận được một lỗi như thế này:Sự khác nhau giữa Vec <struct> và & [struct] là gì?

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

Theo như tôi biết, một là có thể thay đổi và người ta không là nhưng tôi không có ý tưởng làm thế nào để đi giữa các loại, tức là mất một &[u8] và biến nó thành Vec<u8> hoặc ngược lại.

Sự khác nhau giữa chúng là gì? Có giống như String&str không?

Trả lời

5

Có giống như String&str?

Có. A Vec<T> là biến thể thuộc sở hữu của &[T]. &[T] là tài liệu tham khảo thành bộ T s được đặt tuần tự trong bộ nhớ (a.k.a. a slice). Nó đại diện cho một con trỏ đến đầu của các mục và số lượng các mục. Tham chiếu đề cập đến nội dung nào đó mà bạn không sở hữu, do đó, tập hợp các hành động bạn có thể thực hiện với nó bị giới hạn. Có một biến thể có thể thay đổi (&mut [T]), cho phép bạn thay đổi các mục trong slice. Bạn không thể thay đổi bao nhiêu trong slice mặc dù. Nói cách khác, bạn không thể biến đổi bản thân slice.

mất một &[u8] và làm cho nó một Vec

Đối trường hợp cụ thể này:

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

Tuy nhiên, điều này đã cấp phát bộ nhớ không trên stack, sau đó bản sao mỗi giá trị vào bộ nhớ đó. Nó đắt hơn cách khác, nhưng có thể là điều đúng cho một tình huống nhất định.

hoặc ngược lại

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

này về cơ bản là "tự do" như v vẫn sở hữu dữ liệu, chúng tôi chỉ giao ra một tham chiếu đến nó. Đó là lý do tại sao nhiều API cố gắng lấy lát khi có ý nghĩa.

Các vấn đề liên quan