Rust集合是否有能力拥有他们存储的数据?

时间:2016-04-16 04:34:31

标签: rust ownership-semantics

给出以下代码(不编译):

fn main() {
    let mut v = vec!();

    {
        let name = "Bob the Builder".to_string();

        v.push(&name);
    }

    for m in &v{
        println!("{}", m);
    }
}

我创建了一个对Rust String类型的变量绑定,它将超出第一组花括号中的范围。 有没有办法以某种方式移动String的所有权,以便向量本身拥有它?

这是一个任意的例子,但我只想了解这个概念是否可行。

我已经知道,如果我使用字符串文字,这将被视为一个静态字符串,它将在整个应用程序的生命周期中存在,因此这段代码会编译但我只是想了解一个集合在Rust中可以拥有数据。我知道Rust不是Objective-C,但Objective-C的集合能够保留他们的数据。

1 个答案:

答案 0 :(得分:5)

只要你没有传递对它的引用,向量就会拥有它。

将代码更改为:

fn main() {
    let mut v = vec!();
    {
        let name = "Bob the Builder".to_string();

        v.push(name); // <--- no ampersand

        println!("{}", name); // <---- error, use of moved value
    }

    for m in &v {
        println!("{}", m);
    }
}

..抛出错误,因为name现在归Vector所有。如果您允许Vector现在拥有该字符串的事实..您的代码编译(通过删除我的println!调用):

fn main() {
    let mut v = vec!();
    {
        let name = "Bob the Builder".to_string();

        v.push(name); // <--- no ampersand
    }

    for m in &v {
        println!("{}", m); // <--- works fine
    }
}

所以你的问题是你将对字符串的引用传递给向量。从本质上讲,在阻止结束时,您的name值将被删除,并且Vector中的&name引用可能会指向无效的内存..使v[0].something_here()具有潜在的危险性。所以编译器会阻止你。 但是,如果你将name变量的所有权转移到向量中(通过不传递引用但是传递整个事物)那么Rust知道在清理字符串时清理字符串向上。