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

Do Rust collections have the ability to own the data they store?

给定以下代码(无法编译):

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

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

        v.push(&name);
    }

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

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

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

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

矢量将拥有它.. 只要您不传递对它的引用。

将您的代码更改为:

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 知道在什么时候清理字符串它会清理 Vector。