< 返回版块

lwp001 发表于 2021-03-31 11:09

Tags:多次可变借用,无法编译

请求帮助 怎么可以通过编译 ,谢谢!

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);
    }
}

评论区

写评论
johnmave126 2021-04-01 03:02

多嘴一句,for循环里面本质也是移除hashmap的一些值,也可以用相同的思路改写。

--
👇
lwp001: 偷懒,复制了您的 谢谢!

作者 lwp001 2021-03-31 15:03

偷懒,复制了您的 谢谢!

--
👇
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()); }

建议这样来移除value是空的hashmap
作者 lwp001 2021-03-31 15:03

谢谢大家,成功了,思想还是没转变过来。解决了

w 2021-03-31 14:27

可以alarms.iter().filter()来写,没必要整个临时的vec来存吧。

johnmave126 2021-03-31 14:14
    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());
    }

建议这样来移除value是空的hashmap

viruscamp 2021-03-31 14:06

hashmap 删除内容 基本上 for 是不行的, 看看这里
https://stackoverflow.com/questions/28909583/removing-entries-from-a-hashmap-based-on-value

viruscamp 2021-03-31 13:43

你往 removes 里面 push 的 &String 借用自 alarms.iter() 借用了 alarms 也就是说 removes 借用了 alarms 那么此时 alarms.remove(vin); 就是第二次的 mut borrow

作者 lwp001 2021-03-31 13:02

编译报错 多次可变借用

--
👇
johnmave126: 问题在什么地方?

如果是注释掉的那一行的话首先vin就没定义啊...

johnmave126 2021-03-31 12:21

问题在什么地方?

如果是注释掉的那一行的话首先vin就没定义啊...

作者 lwp001 2021-03-31 11:28

谢谢 忘了!

--
👇
munpf: 帖子和评论支持markdown,你把代码用三个反引号围起来格式化一下代码,不然这么看很累的

munpf 2021-03-31 11:15

帖子和评论支持markdown,你把代码用三个反引号围起来格式化一下代码,不然这么看很累的

1 共 11 条评论, 1 页