2

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

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

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

        v.push(&name);
    }

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

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

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

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

4

1 回答 1

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值将被删除,并且您&name在 Vector 中的引用可能会指向无效的内存。这v[0].something_here()可能会造成危险。所以编译器会阻止你。但是,如果您将变量的所有权转移name到向量中(通过不传递引用..而是传递整个内容),那么 Rust 知道在清理向量时清理字符串。

于 2016-04-16T04:42:49.703 回答