如何使用可变成员Vec?

时间:2015-04-02 14:30:40

标签: rust lifetime

这里有Rust的第一步。我搜索了一个答案,但找不到与最新版本有关的任何内容。

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 个答案:

答案 0 :(得分:4)

您不需要任何生命周期或参考资料:

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 struct 拥有向量 - 而不是对它的引用。这确实要求self方法具有可变push(因为您正在更改PG!)。您还必须使pg变量可变。