我正在做一个组合优化项目来学习 Rust,但我遇到了一个无法解决的问题......

我有两个功能:

pub fn get_pareto_front_offline<'a>(scheduling_jobs: &'a Vec<Vec<u32>>, costs_vector: &'a Vec<(u32, u32)>) -> Vec<(&'a Vec<u32>, &'a (u32, u32))> {
    // ...
}


pub fn pareto_approach_offline<'a>(list_of_jobs: &'a mut Vec<Vec<u32>>, neighborhood: &'a mut Vec<Vec<u32>>, costs: &'a Vec<(u32, u32)>) -> Vec<(&'a Vec<u32>, &'a (u32, u32))> {
    let pareto_front = get_pareto_front_offline(neighborhood, costs);

    loop {
        if pareto_front == vec![] {
            break;
        }

        neighborhood.clear();

        for front in pareto_front.iter() {
            neighborhood.push((front.0).clone());
        }
    }

    pareto_front
}

我遇到了一个问题,因为编译器告诉我:
cannot borrow '*neighborhood' as mutable because it is also borrowed as immutableat line 15 col 9
cannot borrow '*neighborhood' as mutable because it is also borrowed as immutableat line 19 col 13

最佳答案

你试图做一些根本不可能的事情。

当您调用 get_pareto_front_offline 时,您会将 neighborhood 的重新借用传递给该函数。必须保持这种重新借用才能使 pareto_front 保持有效。换句话说,只要 pareto_front 存在,编译器就不会允许您以任何方式访问 neighborhood

这是一件好事,因为然后您继续尝试清除我们的 neighborhood ,这几乎肯定会使 pareto_front 无效,可能导致 use-after-free 并破坏您的程序状态。

目前尚不清楚您正在尝试做什么;但你不能这样做。

顺便说一句,即使编译了,该循环也可能永远不会完成运行:您的终止条件( pareto_front == vec![] )永远不会满足,因为您永远不会修改 pareto_front ;它要么立即停止,要么永远运行。

摆脱欠债问题最简单的方法是复制东西,这样你就不需要长期借用了;如果 get_pareto_front_offline 返回的是 Vec<(Vec<u32>, (u32, u32))>,则不会出现此问题。那个,或者修改代码以在您调用 neighborhood 后不接触 get_pareto_front_offline

关于rust - 不能将 `*x` 作为可变借用,因为它也作为不可变借用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33985018/

10-12 05:31