2015-04-02 24 views
1

這裏是Rust的第一步。我搜索了一個答案,但無法找到與最新版本一起工作的任何內容。如何使用可變成員Vec?

struct PG 
{ 
    names: &mut Vec<String> // line 12 
} 

impl PG 
{ 
    fn new() -> PG 
    { 
     PG { names: Vec::new() } // line 19 
    } 

    fn push(&self, s: String) 
    { 
     self.names.push(s); 
    } 
} 

fn main() 
{ 
    let pg = PG::new(); 
    pg.push("John".to_string()); 
} 

如果我編譯上面的代碼,我得到:

src/main.rs:12:12: 12:28 error: missing lifetime specifier [E0106] 
src/main.rs:12  names: &mut Vec<String> 
          ^~~~~~~~~~~~~~~~ 

如果我改變的names類型&'static mut Vec<String>,我得到:

src/main.rs:19:21: 19:31 error: mismatched types: 
expected `&'static mut collections::vec::Vec<collections::string::String>`, 
    found `collections::vec::Vec<_>` 
(expected &-ptr, 
    found struct `collections::vec::Vec`) [E0308] 

我知道我可以使用參數化生活時間,但由於其他原因,我不得不使用static。如何正確創建會員Vec?我在這裏錯過了什麼?非常感謝你。

+1

也許這會幫助你http://stackoverflow.com/questions/36413364/as-i-can-make-the-vector-is-mutable-inside-struct#36720608 – 2016-04-19 15:05:15

回答

3

你不需要任何的壽命或引用在這裏:

struct PG { 
    names: Vec<String> 
} 

impl PG { 
    fn new() -> PG { 
     PG { names: Vec::new() } 
    } 

    fn push(&mut self, s: String) { 
     self.names.push(s); 
    } 
} 

fn main() { 
    let mut pg = PG::new(); 
    pg.push("John".to_string()); 
} 

PG結構擁有載體 - 而不是對它的引用。這確實需要您對push方法有可變的self(因爲您正在更改PG!)。您還必須使pg變量可變。

+0

太棒了!不過,我仍然感到困惑。 'pg'和'self'需要可變,但'names'不能?我以爲我正在改變'名稱',而不是'pg'。如果我能找到有關這方面的好材料,我會學習更多。謝謝! – 2015-04-02 15:16:08

+1

@paulolieuthier結構是完全可變的或不可變的。通過讓'pg'可變,你可以*調用需要可變自引用的方法。 **'PG'中的每個**字段在該方法中都是可變的,包括'names'。 – Shepmaster 2015-04-02 16:16:17