【发布时间】:2017-12-21 06:50:51
【问题描述】:
我对编写以下非常常见的代码的最佳方式感到困惑:
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 块内的突变。理想情况下,我想在测试后立即释放old_best,但目前尚不清楚如何做到这一点。
有一种非常丑陋的方式来做到这一点——创建一个更深的范围来进行测试并公开一个布尔值,然后在此基础上做一个条件。这很实用,但令人不快。
或者,我可以创建一个辅助方法来进行比较(并在它终止时释放它的借用),它看起来更干净,但仍然感觉臃肿。
有没有更简洁的方法来实现这一点?
【问题讨论】:
标签: rust idioms borrow-checker