请求帮助 怎么可以通过编译 ,谢谢!
pub struct AlarmInfo {
start_time: DateTime<Utc>,
end_time: Option<DateTime<Utc>>,
}
// duration_is_over 函数判断是否超时
/// 定时检查是否超时 i32 代表报警类型
fn interval_alarm(alarms: &mut HashMap<String, HashMap<i32, AlarmInfo>>) {
let mut removes = vec![];
{
for vehicle_alarms in alarms.iter() {
// let vehicle_alarms = alarms.get_mut(vin).unwrap();
if vehicle_alarms.1.is_empty() {
removes.push(vehicle_alarms.0);
continue;
}
let mut remove_single_vin =vec![];
for (index, alarm_info) in vehicle_alarms.1 {
if let Some(end) = &alarm_info.end_time {
// 判断时间是否超时
if duration_is_over(&Utc::now(), &end) {
// 形成报警记录,并移除当前的记录
remove_single_vin.push(index);
}
} else {
// 只有开始,且超时不形成记录 移除
if duration_is_over(&Utc::now(), &alarm_info.start_time) {
remove_single_vin.push(index);
}
}
}
// 移除不需要的数据
for index in remove_single_vin{
vehicle_alarms.1.remove(index);
}
}
}
// 移除空的报警
for vin in removes {
alarms.remove(vin);
}
}
1
共 11 条评论, 1 页
评论区
写评论多嘴一句,for循环里面本质也是移除hashmap的一些值,也可以用相同的思路改写。
--
👇
lwp001: 偷懒,复制了您的 谢谢!
偷懒,复制了您的 谢谢!
--
👇
johnmave126: ```rust fn interval_alarm(alarms: &mut HashMap<String, HashMap<i32, AlarmInfo>>) { for (vin, vehicle_alarms) in alarms.iter_mut() { let mut remove_single_vin = vec![]; for (&index, alarm_info) in vehicle_alarms.iter() { if let Some(end) = &alarm_info.end_time { // 判断时间是否超时 if duration_is_over(&Utc::now(), &end) { // 形成报警记录,并移除当前的记录 remove_single_vin.push(index); } } else { // 只有开始,且超时不形成记录 移除 if duration_is_over(&Utc::now(), &alarm_info.start_time) { remove_single_vin.push(index); } } } // 移除不需要的数据 for index in remove_single_vin { vehicle_alarms.remove(&index); } } // 移除空的报警 alarms.retain(|_, vehicle_alarms| !vehicle_alarms.is_empty()); }
谢谢大家,成功了,思想还是没转变过来。解决了
可以alarms.iter().filter()来写,没必要整个临时的vec来存吧。
建议这样来移除value是空的hashmap
hashmap 删除内容 基本上 for 是不行的, 看看这里
https://stackoverflow.com/questions/28909583/removing-entries-from-a-hashmap-based-on-value
你往 removes 里面 push 的 &String 借用自 alarms.iter() 借用了 alarms 也就是说 removes 借用了 alarms 那么此时 alarms.remove(vin); 就是第二次的 mut borrow
编译报错 多次可变借用
--
👇
johnmave126: 问题在什么地方?
如果是注释掉的那一行的话首先
vin
就没定义啊...问题在什么地方?
如果是注释掉的那一行的话首先
vin
就没定义啊...谢谢 忘了!
--
👇
munpf: 帖子和评论支持markdown,你把代码用三个反引号围起来格式化一下代码,不然这么看很累的
帖子和评论支持markdown,你把代码用三个反引号围起来格式化一下代码,不然这么看很累的