2015-08-21 16 views
5

Jestem nowy w Rust i uruchomiony na problem podobny do następujących kilka razy:Jak przenieść własność ciągów?

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); 
    } 
} 

co daje następujący błąd:

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

Jak mogę przenieść prawo własności do napisu wektor (nie chcesz kopiować)? Czy potrzebuję życia? Czy powinien to być str lub String (przypuśćmy, że nie chcę mutować samych elementów w wektorze)?

Odpowiedz

7

Podaj wektor String, a nie jako odniesienie do jednego. Właścicielem jest Foo, pożyczona jest &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); 
    } 
} 

W przykładzie, jesteś alokowanie String wewnątrz dla ciała pętli, a następnie biorąc odniesienie do niego. Ponieważ nic nie jest właścicielem String, jest on upuszczany na końcu korpusu pętli. Oznacza to, że wszelkie odniesienia stracą ważność. Rust zapobiega naruszeniu bezpieczeństwa pamięci.

W rzeczywistym świecie, że nigdy nie trzeba określić typ tutaj, typ wnioskowanie wystarczy:

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); 
    } 
} 

A ty prawdopodobnie używać map przekonwertować jeden kawałek rzeczy do drugiego:

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

Niejawne jest, że nie ma sensu mieć &String; równie dobrze możesz mieć &str.

+1

Aby upewnić się, że ciąg jest przenoszony, a nie kopiowany w takim przypadku, jest poprawny? Czy trzeba jednoznacznie skopiować w Rust (w przeciwieństwie do C++)? – gnash

+2

@gnash Tak, zgadza się. – emlai

+1

'let as_str: Vec <_> = (1..6) .map (| i | i.to_string()). Collect()' jest innym sposobem na osiągnięcie tego, co PO jest po. – Akavall