期权为无时如何终止借贷

时间:2018-07-04 02:35:35

标签: 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分支中,我不再使用借入的值,因为开始时没有要借的值。

我有一个适用于此特定情况的重写版本:

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

之所以可行,是因为使用len意味着我什至在尝试借用任何东西之前都见证了“什么也没借”,然后仅在嵌套范围内借。我担心,这种情况在我拥有Option的每种情况下都行不通,但是,并非每个返回Option的API都只有布尔值的变体。

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

1 个答案:

答案 0 :(得分:1)

由于(在稳定的)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 块,因此,可变借用只要结束就可以。

>

也就是说,如果您想启用不稳定的non-lexical lifetimes功能,Rust night可以解决此问题。如果仅在板条箱顶部包括行#![feature(nll)],则您现有的代码应该可以正常工作。