给出以下代码(不编译):
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 回答
只要你没有传递对它的引用,向量就会拥有它 .
将代码更改为:
..出现错误,因为
name
现在归Vector所有 . 如果您允许Vector现在拥有该字符串的事实..您的代码编译(通过删除我的println!
调用):所以你的问题是你将对字符串的引用传递给向量 . 基本上,在块的末尾,您的
name
值将被删除,并且Vector中的&name
引用可能会指向无效的内存..使v[0].something_here()
具有潜在的危险性 . 所以编译器会阻止你 . 但是,如果你将name
变量的所有权转移到向量中(通过不传递引用但传递整个事物),那么Rust知道在清理向上时清理字符串 .