我正在尝试编写一个函数,该函数仅在元素大于向量中已经存在的最后一个元素时将元素推到排序向量的末尾,否则返回错误,并带有对最大元素的引用。据我所知,这似乎没有违反任何借用规则,但借用检查器不喜欢它。我不明白为什么。
struct MyArray<K, V>(Vec<(K, V)>);
impl<K: Ord, V> MyArray<K, V> {
pub fn insert_largest(&mut self, k: K, v: V) -> Result<(), &K> {
{
match self.0.iter().next_back() {
None => (),
Some(&(ref lk, _)) => {
if lk > &k {
return Err(lk);
}
}
};
}
self.0.push((k, v));
Ok(())
}
}
error[E0502]: cannot borrow `self.0` as mutable because it is also borrowed as immutable
--> src/main.rs:15:9
|
6 | match self.0.iter().next_back() {
| ------ immutable borrow occurs here
...
15 | self.0.push((k, v));
| ^^^^^^ mutable borrow occurs here
16 | Ok(())
17 | }
| - immutable borrow ends here
为什么这不起作用?
我们可以将任何带有 return 语句的函数转换为没有 return 语句的函数,如下所示:
fn my_func() -> &MyType {
'inner: {
// Do some stuff
return &x;
}
// And some more stuff
}
进入
fn my_func() -> &MyType {
let res;
'outer: {
'inner: {
// Do some stuff
res = &x;
break 'outer;
}
// And some more stuff
}
res
}
由此,很明显,借用超出了 的范围'inner
。
为了借用检查而使用以下重写有什么问题吗?
fn my_func() -> &MyType {
'outer: {
'inner: {
// Do some stuff
break 'outer;
}
// And some more stuff
}
panic!()
}
考虑到 return 语句可以防止之后发生任何可能违反借用规则的事情。