rust - 有条件地修改 Vec 的可选元素的最惯用的 Rust 方法是什么?

标签 rust idioms borrow-checker

我对编写以下非常常见的代码的最佳方式感到困惑:

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_posVec<Vec<Option<BigInt>>> ;当我们在该点找到最佳成本的新可能性时,我们想要 (a) 检查新成本是否优于旧成本,以及 (b) 如果是,则更新向量。

问题是 old_bestbest_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/

相关文章:

rust - 为什么我必须显式转换为受约束的类型?

assembly - 发布与 Debug模式下局部堆栈变量的代码生成

reference - 为什么对泛型函数中特征的引用必须实现 `Sized` ?

rust - Rust 中相对向量大小调整的一行代码

rust - 如何在可变引用结构中为字段交换新值?

当预期列表仅包含单个元素时获取列表元素的 Pythonic 方法?

python - 将类表示为字典或列表

rust - 我可以在 Rust 中创建一个包含字符串和该字符串切片的结构吗?

rust - 函数声明中更具体的 self

rust - 如何制作具有 RAII 属性的订阅者对象?