我正在做一个组合优化项目来学习 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/