Rust 集合是否有能力拥有它们存储的数据?
Do Rust collections have the ability to own the data they store?
给定以下代码(无法编译):
fn main() {
let mut v = vec!();
{
let name = "Bob the Builder".to_string();
v.push(&name);
}
for m in &v{
println!("{}", m);
}
}
我创建了一个绑定到 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);
}
}
.. 抛出错误,因为 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 知道在什么时候清理字符串它会清理 Vector。
给定以下代码(无法编译):
fn main() {
let mut v = vec!();
{
let name = "Bob the Builder".to_string();
v.push(&name);
}
for m in &v{
println!("{}", m);
}
}
我创建了一个绑定到 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);
}
}
.. 抛出错误,因为 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 知道在什么时候清理字符串它会清理 Vector。