gpt4 book ai didi

rust - 错误[E0597] : borrowed value does not live long enough in While loop

转载 作者:行者123 更新时间:2023-12-03 11:25:47 30 4
gpt4 key购买 nike

我是 Rust 的新手,我无法解决这个错误,但只有当我注释掉 while 语句时才会发生这种情况,基本上我是从控制台询问值并将其存储在 HashMap 中:

use std::collections::HashMap;
use std::io;

fn main() {
let mut customers = HashMap::new();
let mut next_customer = true;
while next_customer {
let mut input_string = String::new();
let mut temp_vec = Vec::with_capacity(3);
let mut vec = Vec::with_capacity(2);
println!("Insert new customer f.e = customer id,name,address:");
io::stdin().read_line(&mut input_string);
input_string = input_string.trim().to_string();
for s in input_string.split(",") {
temp_vec.push(s);
}
vec.push(temp_vec[1]);
vec.push(temp_vec[2]);
let mut key_value = temp_vec[0].parse::<i32>().unwrap();
customers.insert(key_value, vec);
next_customer = false;
}
println!("DONE");
}

代码导致错误

error[E0597]: `input_string` does not live long enough
--> src/main.rs:14:18
|
14 | for s in input_string.split(",") {
| ^^^^^^^^^^^^ borrowed value does not live long enough
...
20 | customers.insert(key_value, vec);
| --------- borrow later used here
21 | next_customer = false;
22 | }
| - `input_string` dropped here while still borrowed

最佳答案

正如其他人所说,问题在于放入客户 map 的值的生命周期和/或类型。

customers.insert(key_value, vec);
| --------- borrow later used here

当编译器决定给一个对象一个你没有预料到的类型时,通常会发生这种情况。要找出它在做什么,你可以强制输入,看看它是如何提示的。将代码更改为:

    let mut customers: HashMap<(),()> = HashMap::new();

给我们两个相关的错误:

20 |         customers.insert(key_value, vec);
| ^^^^^^^^^ expected `()`, found `i32`
...
20 | customers.insert(key_value, vec);
| ^^^ expected `()`, found struct `std::vec::Vec`
|
= note: expected unit type `()`
found struct `std::vec::Vec<&str>`

所以编译器想要给客户对象的类型是HashMap<i32, Vec<&str>>

问题在于 &str生命周期必须在 block 内,因为我们不存储 String s 在任何地方,他们不能拥有 'static生命周期,因为它们是用户输入。

这意味着我们可能需要 HashMap<i32,Vec<String>> .

更改代码以使用其中之一会给我们一个关于 vec 的错误。没有正确的类型:它被推断为 Vec<&str> ,但我们想要一个 Vec<String> .

我们有两个选择。

  1. 在我们使用 customers.insert(key_value, vec.iter().map(|s| s.to_string()).collect()) 将 vec 插入 map 之前将其转换为正确的类型. (尽管为了清晰起见,您可能希望将其提取到变量中)。

  2. 将 vec 的类型显式更改为 Vec<String>

选项 1“有效”。虽然选项 2 使我们走上了一条使类似更改越来越接近 read_line 的道路。打电话。

一旦您决定了选项 1 中的修复,如果您发现它们过于嘈杂,您可以删除为解决修复而添加的手动类型注释。

关于rust - 错误[E0597] : borrowed value does not live long enough in While loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60555208/

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