<分区>
以下代码将使借用检查器失败:
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
调用作为了解是否存在值的主要方式?