首页 文章

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

提问于
浏览
2

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

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

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

        v.push(&name);
    }

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

我创建了一个绑定到Rust String 类型的变量,它将超出第一组花括号中的范围 . Is there a way to somehow move the ownership of the String such that the vector itself owns it?

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

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

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

相关问题