给出以下代码(不编译):
fn main() {
let mut v = vec!();
{
let name = "Bob the Builder".to_string();
v.push(&name);
}
for m in &v{
println!("{}", m);
}
}
我创建了一个对Rust String
类型的变量绑定,它将超出第一组花括号中的范围。 有没有办法以某种方式移动String的所有权,以便向量本身拥有它?
这是一个任意的例子,但我只想了解这个概念是否可行。
我已经知道,如果我使用字符串文字,这将被视为一个静态字符串,它将在整个应用程序的生命周期中存在,因此这段代码会编译但我只是想了解一个集合在Rust中可以拥有数据。我知道Rust不是Objective-C,但Objective-C的集合能够保留他们的数据。
答案 0 :(得分: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知道在清理字符串时清理字符串向上。