【发布时间】:2017-12-11 12:33:29
【问题描述】:
借用检查器让我很难找到一个优雅的实现。这是一个最小的例子:
use std::collections::VecDeque;
fn main() {
let mut vec1 = VecDeque::new();
vec1.push_back(2.);
let mut vec2 = VecDeque::new();
vec2.push_back(1.);
while let (Some(x), Some(y)) = (vec1.front_mut(), vec2.front_mut()) {
if x < y {
*y -= *x;
vec1.pop_front();
} else {
*x -= *y;
vec2.pop_front();
}
}
assert_eq!(vec2.len(), 0);
assert_eq!(vec1.pop_front(), Some(1.));
}
这不会编译:
error[E0499]: cannot borrow `vec1` as mutable more than once at a time
--> src/main.rs:13:13
|
10 | while let (Some(x), Some(y)) = (vec1.front_mut(), vec2.front_mut()) {
| ---- first mutable borrow occurs here
...
13 | vec1.pop_front();
| ^^^^ second mutable borrow occurs here
...
18 | }
| - first borrow ends here
error[E0499]: cannot borrow `vec2` as mutable more than once at a time
--> src/main.rs:16:13
|
10 | while let (Some(x), Some(y)) = (vec1.front_mut(), vec2.front_mut()) {
| ---- first mutable borrow occurs here
...
16 | vec2.pop_front();
| ^^^^ second mutable borrow occurs here
17 | }
18 | }
| - first borrow ends here
if x < y 范围必须嵌套在 x 和 y 的范围中,那么我如何才能根据它们的第一个元素对 vec1/vec2 进行变异?
【问题讨论】:
-
对熟悉非词法生命周期计划的人提出的问题:一旦 NLL 实现,这段代码就可以工作吗?在我看来,它似乎可以。
-
@SvenMarnach 根据我对 NLL 的了解,是的,这段代码应该可以正常工作。
-
NLL 已经登陆 Nightly,这确实适用于盒子:play.rust-lang.org/…
标签: rust borrow-checker