2015-08-21 16 views
5

Tôi mới vào Rust và đã chạy vào một vấn đề tương tự với một vài lần sau:Làm cách nào để chuyển quyền sở hữu chuỗi?

fn main() { 
    let mut as_str: Vec<&String> = Vec::new(); 
    for i in [1, 2, 3, 4, 5].iter() { 
     let i_str = i.to_string(); 
     as_str.push(&i_str); 
    } 
} 

nào mang lại các lỗi sau:

<anon>:6:22: 6:27 error: `i_str` does not live long enough 
<anon>:6   as_str.push(&i_str); 
          ^~~~~ 

Làm thế nào để chuyển quyền sở hữu của chuỗi vectơ (không muốn sao chép)? Tôi có cần cả đời không? Nó có nên là một str hoặc một String (giả sử tôi không muốn tự biến đổi các mục trong vector)?

Trả lời

7

Đặt véc tơ String, không phải là tham chiếu đến một véc tơ. A Foo được sở hữu, một khoản vay là &Foo.

fn main() { 
    let mut as_str: Vec<String> = Vec::new(); 
    for i in [1, 2, 3, 4, 5].iter() { 
     let i_str = i.to_string(); 
     as_str.push(i_str); 
    } 
} 

Trong ví dụ của bạn, bạn đang phân bổ String bên trong vòng lặp for body, sau đó tham chiếu đến nó. Vì không có gì sở hữu số String, nó sẽ được thả ở cuối thân vòng lặp. Điều đó có nghĩa là mọi tham chiếu sẽ trở thành không hợp lệ. Rust ngăn chặn vi phạm an toàn bộ nhớ này.

Trong thế giới thực, bạn sẽ không bao giờ cần phải xác định loại ở đây, suy luận kiểu là đủ:

fn main() { 
    let mut as_str = Vec::new(); 
    for i in [1, 2, 3, 4, 5].iter() { 
     let i_str = i.to_string(); 
     as_str.push(i_str); 
    } 
} 

Và bạn có thể muốn sử dụng map để chuyển đổi một lát mọi thứ khác:

fn main() { 
    let as_str: Vec<_> = [1, 2, 3, 4, 5].iter().map(|i| i.to_string()).collect(); 
} 

Ngẫu nhiên, không bao giờ có ý nghĩa khi có &String; bạn cũng có thể có một số &str.

+1

Để đảm bảo, Chuỗi được di chuyển và không được sao chép trong trường hợp đó đúng? Người ta có phải sao chép rõ ràng trong Rust (không giống như C++)? – gnash

+2

@gnash Vâng, đúng vậy. – emlai

+1

'let as_str: Vec <_> = (1..6) .map (| i | i.to_string()). Collect()' là một cách khác để đạt được những gì OP là sau. – Akavall

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