Rust 选项为“无”时如何结束借用

Rust 选项为“无”时如何结束借用,rust,borrow-checker,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) } }

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

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)
        }
    }
}
这是因为使用
len
意味着我在尝试借用任何东西之前就看到了“无需借用”,然后只在嵌套范围内借用。我担心这不会在我有
选项的每种情况下都起作用,但是,每个
选项返回的API可能没有一个纯布尔变量


是否有一种方法可以重新构造此代码以使其正常工作,但仍然使用
get
调用作为主要方法来了解是否存在值?

这是一个常见的问题,因为生命周期目前在(稳定)状态下工作。在您的案例中,标准解决方案类似于此:

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)
}
fn at(&mut self,i:usize)->选项{
如果let Some(x)=self.vector.get(i){
返回一些(x);
}
//变异自向量
self.at(i)
}
正如您可能看到的那样,
self.vector
的不可变借用只会持续if块的时间,因此只要它结束,就可以对其进行可变借用

也就是说,Rust nightly有一个解决这个问题的方法,如果您想启用不稳定特性的话。如果只包含
#行,现有代码应该可以正常工作![功能(nll)]
位于板条箱顶部

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)
}