gpt4 book ai didi

rust - Rust 集合是否有能力拥有它们存储的数据?

转载 作者:行者123 更新时间:2023-11-29 08:04:01 25 4
gpt4 key购买 nike

给定以下代码(无法编译):

fn main() {
let mut v = vec!();

{
let name = "Bob the Builder".to_string();

v.push(&name);
}

for m in &v{
println!("{}", m);
}
}

我已经创建了一个绑定(bind)到 Rust String 类型的变量,它将超出第一组大括号内的范围。 有没有办法以某种方式移动 String 的所有权,使 vector 本身拥有它?

这是一个任意示例,但我只是想了解这个概念是否可行。

我已经知道,如果我使用字符串文字,这将被视为静态字符串,它将在整个应用程序的生命周期内存在,因此这段代码可以编译,但我只是想了解 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
}
}

所以您的问题是您将对字符串的引用传递到向量中。本质上,在 block 的末尾,您的 name 值将被删除,并且 Vector 中的 &name 引用可能指向无效内存..使 v[0 ].something_here() 潜在危险。所以编译器会阻止你。 但是,如果您将 name 变量的所有权转移到 vector 中(通过不传递引用......而是传递整个东西),那么 Rust 知道在什么时候清理字符串它会清理 Vector。

关于rust - Rust 集合是否有能力拥有它们存储的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36660144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com