以下代码将使借阅检查器失败:
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
调用作为知道是否有值的主要方法?
答案 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)]
,则您现有的代码应该可以正常工作。