我对编写以下非常常见的代码的最佳方式感到困惑:
let old_best = best_by_pos[y][x].as_ref();
if old_best.is_none() || &new_cost < old_best.unwrap() {
best_by_pos[y][x] = Some(new_cost.clone());
}
这只是一个代码示例,但它说明了问题。
best_by_pos
是 Vec<Vec<Option<BigInt>>>
;当我们在该点找到最佳成本的新可能性时,我们想要 (a) 检查新成本是否优于旧成本,以及 (b) 如果是,则更新向量。
问题是 old_best
借best_by_pos
不可变的,并且借用一直持续到范围结束。这可以防止 if block 内的突变。理想情况下,我想释放 old_best
测试后立即进行,但不清楚如何进行。
有一种非常丑陋的方法可以做到这一点——创建一个更深的范围来进行测试并公开一个 bool 值,然后对其进行条件处理。这是功能性的但令人不快。
或者,我可以制作一个辅助方法来进行比较(并在它终止时释放它的借用),它看起来更干净,但仍然感觉臃肿。
有没有更简洁的方法来实现这一目标?
最佳答案
您可以使 old_best
成为 vector 的可变引用,并在赋值中写入它。这也允许您避免再次索引向量:
let old_best = &mut best_by_pos[y][x];
if old_best.is_none() || &new_cost < old_best.as_ref().unwrap() {
*old_best = Some(new_cost.clone());
}
关于rust - 有条件地修改 Vec 的可选元素的最惯用的 Rust 方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45132283/