Rust Collection是否有能力拥有其存储的数据?

Rust Collection是否有能力拥有其存储的数据?,rust,ownership-semantics,Rust,Ownership Semantics,给定以下代码(未编译): 我已经创建了一个绑定到RustString类型的变量,它将超出第一组花括号的范围是否有办法移动字符串的所有权,从而使向量本身拥有它? 这是一个武断的例子,但我只是想了解这个概念是否可行 我已经知道,如果我使用字符串文字,这将被视为一个静态字符串,它将在整个应用程序的生命周期内存在,因此这段代码将被编译,但我只是想了解Rust中的集合是否可以拥有数据。我知道Rust不是Objective-C,但Objective-C拥有能够保留其数据的集合。矢量将拥有它。。只要你不传递它

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

我已经创建了一个绑定到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);
    }
}

所以你的问题是你要把字符串的引用传递到向量中。基本上,在块的末尾,您的
名称
值将被删除,并且向量中的
名称
引用可能指向无效内存。。使
v[0]。此处有某种东西()
具有潜在危险。所以编译器会阻止你。但是,如果您将
name
变量的所有权转移到向量中(通过不传递引用,而是传递整个内容),那么Rust知道在清理向量时清理字符串。

这就是doh!当你这样说的时候,那是非常有意义的。谢谢你的帮助。@RalphCaraveo学习新语言时,我总是推荐你。
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);
    }
}
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
    }
}