rust - 当 Option 为 None 时如何结束借用

标签 rust borrow-checker

以下代码将使借用检查器失败:

fn at(&mut self, i: usize) -> Option<&T> {
    match self.vector.get(i) {
        Some(x) => Some(x),
        None => {
            self.mutate_vector_to_have_more_stuff();
            self.at(i)
        }
    }
}

我明白了为什么:self.vector 仍然是词法借用到最后,所以我不能再借用 self

构建范围的正确方法是什么?借用持续存在于匹配中,因为我实际上在 Some(x) 分支中使用它,但在 None 分支中我不再使用借用的值,因为没有开始借用的值(value)。

我有一个适用于这个特定案例的重写版本:

if i >= self.vector.len() {
    self.mutate_vector_to_have_more_stuff();
    self.at(i)
} else {
    self.vector.get(i)
}

这是有效的,因为使用 len 意味着我在尝试借用任何东西之前就见证了“没有东西可以借用”,然后只在嵌套范围内借用。我担心这在我有 Option 的所有情况下都不起作用,但是,可能不是每个 Option 返回 API 的 bool 变体.

有没有一种方法可以重组此代码使其正常工作,但仍使用 get 调用作为了解是否存在值的主要方式?

最佳答案

由于当前在(稳定的)Rust 中的生命周期工作方式,这是一个常见问题。在您的情况下,标准解决方案看起来像这样:

fn at(&mut self, i: usize) -> Option<&T> {
    if let Some(x) = self.vector.get(i) {
        return Some(x);
    }
    // mutate self.vector
    self.at(i)
}

正如您可能看到的那样,self.vector 的不可变借用仅持续到 if block ,因此可以尽快对其进行可变借用它结束了。

也就是说,如果您想启用不稳定的 non-lexical lifetimes,Rust nightly 有解决此问题的方法。特征。如果您只在 crate 顶部包含 #![feature(nll​​)] 行,您现有的代码应该可以正常工作。

关于rust - 当 Option 为 None 时如何结束借用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51165043/

相关文章:

rust - 什么是有和无?

rust - 匹配后如何修改值?

rust - "Does not live long enough"`Weak<RefCell<_>>` 错误

rust - 在调用时引用其自身字段之一的结构上设置处理程序

rust - 解包时无法移出共享引用背后的值

rust - 根据编译目标操作系统,Rust 中将不同类型的值分配给变量的惯用方式是什么?

rust - 如何定义函数类型参数(或其关联类型)的函数局部类型别名?

split - 在 Rust 中将拆分解包为元组?

unit-testing - 如何测试依赖于环境变量的 Rust 方法?

rust - 可变引用有移动语义吗?