gpt4 book ai didi

string - char 到 string 转换的所有权问题

转载 作者:行者123 更新时间:2023-12-05 08:45:59 27 4
gpt4 key购买 nike

我的失败代码(Minimal, Reproducible Example):

// my code

fn test() {
let mut list: Vec<Text> = Vec::new();
const ARRAY: [char; 3] = ['a', 'b', 'c'];
for (i, _) in ARRAY.iter().enumerate() {
list.push(Text::new(&ARRAY[i].to_string()));
}
}

// external crate

#[derive(Debug, Clone, Copy, PartialEq)]
struct Text<'a> {
pub text: &'a str,
}

impl<'a> Text<'a> {
pub fn new(text: &'a str) -> Self {
Text {
text
}
}
}

编译器:“借用时临时值下降”。下面的红色波浪线

ARRAY[i].to_string()

我猜是经典的借用检查器问题?

我尝试将类型更改为 &str 而不是 char 并且一切正常:

// my code
fn test() {
let mut list: Vec<Text> = Vec::new();
const ARRAY: [&str; 3] = ["a", "b", "c"]; // CHANGE HERE
for (i, _) in ARRAY.iter().enumerate() {
list.push(Text::new(&ARRAY[i])); // CHANGE HERE
}
}

无法弄清楚 char 或使用 to_string() 进行的转换有什么特别之处导致此代码失败。

最佳答案

您的失败代码等同于此代码:

for a in &ARRAY {
let temp = a.to_string();
list.push(Text::new(&temp));
drop(temp);
}

除了临时变量在我的代码中有一个名称(对 drop() 的调用是多余的,为了清楚起见,我添加了它)。

所以在循环中创建的所有临时对象都作为引用添加到列表中,记住 Text持有一个引用,而不是字符串本身。但是这些临时对象不会在创建它们的迭代中存活下来,因此您的列表包含悬空引用。 Rust 检测到这一点并且无法编译。

简单的解决方案是修改 Text持有 String本身,而不是引用。如果你不能修改它,那么你的字符串必须存在于某个地方,你可以构建一个 Vec<String>并从那里获取引用资料:

fn test() {
const ARRAY: [char; 3] = ['a', 'b', 'c'];
let mut tmps: Vec<String> = Vec::new();
for a in &ARRAY {
tmps.push(a.to_string());
}
let list: Vec<Text> = tmps
.iter()
.map(|s| Text::new(s))
.collect();
}

您的第二个代码之所以有效,是因为现在您的数组包含静态引用 &'static str所以任何地方都没有临时变量。

关于string - char 到 string 转换的所有权问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70740634/

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