You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Rust中E0502可变借用错误——FIFO页面置换算法页错误计数实现

解决Rust中FIFO页面置换算法的可变借用错误[E0502]

我来帮你搞定这个借用错误,顺便也修正下代码里的逻辑问题——毕竟FIFO算法逻辑不对的话,就算编译通过结果也会出错。

先说说错误原因

你遇到的E0502是Rust借用检查器的经典报错,核心规则是:同一时间不能对同一个值既有不可变借用又有可变借用,而且不可变借用不能在可变借用之后继续使用。看你出错的这段代码:

let val = indexes.front(); // 这里创建了对indexes的不可变引用(返回Option<&i32>)
indexes.pop_front();       // 这里对indexes做了可变借用,直接修改了队列
s.remove(&val.unwrap());   // 这里还在使用之前的不可变引用val,触发错误

val是指向indexes内部元素的引用,当你调用pop_front()修改队列后,这个引用就可能失效了(被弹出的元素已经被移除),Rust会直接阻止这种危险操作。

解决方法+逻辑修正

解决借用问题很简单:先把indexes.front()的值取出来(拿到独立的数值,而不是引用),再执行pop_front()。另外我发现你的FIFO算法逻辑有两处写反了,一起帮你修正了:

use std::collections::{HashSet, VecDeque};

fn page_fault(capacity: i32, n: i32, pages: &[i32]) -> i32 {
    let mut page_set: HashSet<i32> = HashSet::new();
    let mut page_queue: VecDeque<i32> = VecDeque::new();
    let mut page_fault_count: i32 = 0;

    // 用迭代器遍历更简洁,避免手动索引转换
    for &current_page in pages.iter().take(n as usize) {
        if page_set.len() as i32 < capacity {
            // 页面不在集合里才会产生页错误
            if !page_set.contains(&current_page) {
                page_set.insert(current_page);
                page_fault_count += 1;
                page_queue.push_back(current_page); // FIFO队列新页面加到队尾
            }
        } else {
            // 只有页面不在集合里时,才需要执行置换逻辑
            if !page_set.contains(&current_page) {
                // 先复制队头的值,再弹出队列,避免借用冲突
                if let Some(removed_page) = page_queue.front().copied() {
                    page_queue.pop_front();
                    page_set.remove(&removed_page);
                    page_set.insert(current_page);
                    page_queue.push_back(current_page);
                    page_fault_count += 1;
                }
            }
        }
    }

    page_fault_count
}

关键改动说明

  1. 解决借用冲突:用indexes.front().copied()把Option<&i32>转换成Option<i32>,这样removed_page是独立的i32值,不再依赖对队列的引用,彻底避开了借用冲突。
  2. 修正逻辑错误:两个分支都把条件改成了!page_set.contains(&current_page)——只有页面不在内存中时,才会产生页错误、执行插入/置换操作,符合FIFO算法的核心逻辑。
  3. 修复队列操作:把错误的indexes.insert(i as usize, ...)改成page_queue.push_back(current_page),FIFO队列必须把新页面加到队尾,而不是插入到循环索引位置。
  4. 代码优化:用迭代器遍历页面,避免手动做i到usize的类型转换,代码更简洁安全。

内容的提问来源于stack exchange,提问作者Котик Вася

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 11:32:37