如何转让字符串的所有权?

时间:2015-08-21 04:09:34

标签: rust

我是Rust的新手,并且遇到了类似以下几次的问题:

fn main() {
    let mut as_str: Vec<&String> = Vec::new();
    for i in [1, 2, 3, 4, 5].iter() {
        let i_str = i.to_string();
        as_str.push(&i_str);
    }
}

产生以下错误:

<anon>:6:22: 6:27 error: `i_str` does not live long enough
<anon>:6         as_str.push(&i_str);
                          ^~~~~

如何将字符串的所有权转移到向量(不想复制)?我需要一辈子吗?它应该是str还是String(假设我不想在向量中改变项目本身)?

1 个答案:

答案 0 :(得分:7)

为向量指定String,而不是对向量的引用。拥有Foo,借用&Foo

fn main() {
    let mut as_str: Vec<String> = Vec::new();
    for i in [1, 2, 3, 4, 5].iter() {
        let i_str = i.to_string();
        as_str.push(i_str);
    }
}

在您的示例中,您在for循环体内分配String,然后引用它。由于没有任何东西拥有String,因此它会在循环体的末尾被删除。这意味着任何引用都将变为无效。 Rust可以防止这种内存安全违规。

在现实世界中,您永远不需要在此处指定类型,类型推断就足够了:

fn main() {
    let mut as_str = Vec::new();
    for i in [1, 2, 3, 4, 5].iter() {
        let i_str = i.to_string();
        as_str.push(i_str);
    }
}

您可能会使用map将一片事物转换为另一片事物:

fn main() {
    let as_str: Vec<_> = [1, 2, 3, 4, 5].iter().map(|i| i.to_string()).collect();
}

顺便说一句,拥有&String是没有意义的。你可能还有&str