Rust Pop元素取决于其内容

Rust Pop元素取决于其内容,rust,borrow-checker,Rust,Borrow Checker,借用检查器让我很难找到一个优雅的实现。下面是一个简单的例子: 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()

借用检查器让我很难找到一个优雅的实现。下面是一个简单的例子:

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

如果x
作用域必须嵌套在
x
y
的作用域中,那么我如何根据它们的第一个元素变异
vec1
/
vec2

use std::collections::VecDeque;

fn main() {
    let mut vec1 = VecDeque::new();
    vec1.push_back(2.);

    let mut vec2 = VecDeque::new();
    vec2.push_back(1.);

    loop {
        let pop_vec1;

        if let (Some(x), Some(y)) = (vec1.front_mut(), vec2.front_mut()) {
            if x < y {
                *y -= *x;
                pop_vec1 = true;
            } else {
                *x -= *y;
                pop_vec1 = false;
            }
        } else {
            break;
        }

        if pop_vec1 {
            vec1.pop_front();
        } else {
            vec2.pop_front();
        }
    }

    assert_eq!(vec2.len(), 0);
    assert_eq!(vec1.pop_front(), Some(1.));
}
使用std::collections::VecDeque;
fn main(){
让mut vec1=VecDeque::new();
vec1.向后推(2);
让mut vec2=VecDeque::new();
vec2.向后推(1);
环路{
让pop_vec1;
如果let(Some(x),Some(y))=(vec1.front_mut(),vec2.front_mut()){
如果x
或者,如果您喜欢线条较少的循环:

loop {
    let pop_vec1 = match (vec1.front_mut(), vec2.front_mut()) {
        (Some(ref x), Some(ref mut y)) if x < y => { **y -= **x; true },
        (Some(x), Some(y)) => { *x -= *y; false },
        _ => break,
    };

    VecDeque::pop_front(if pop_vec1 { &mut vec1 } else { &mut vec2 });
}
循环{
让pop_vec1=匹配(vec1.front_mut(),vec2.front_mut()){
(一些(ref x),一些(ref mut y))如果x{**y-=**x;true},
(一些(x),一些(y))=>{*x-=*y;false},
_=>休息,
};
VecDeque::pop_front(如果pop_vec1{&mut vec1}或者{&mut vec2});
}
不是很优雅,但很管用


VecDeque
缺少一个方法。也许Rust团队会添加它。

如果您希望在
VecDeque
中添加一个
drain\u filter
,最简单的方法是创建一个RFC来提议它,然后实施它。我猜想以
Vec
为例应该不会太复杂。@MatthieuM。我对生锈的过程一无所知。这对我来说不是“最简单的”。我更担心的是“管理”方面的问题,而不是技术方面的问题。也许“最简单”这个词不合适。。。“最快”可能更好。另一个选择是在IRC上提到它,并希望有人能接受它。这是一个足够小的任务,有人想在Rust standard library中弄湿他们的脚趾,可以合理地处理它。为了它的价值,(仅2周前!),所以我想你也不一定需要一个。我希望不必使用flag变量,但总而言之,这是一个合理的干净解决方案,嘿,它有效;)向熟悉非词汇生存期计划的人提出的问题:一旦NLL被实现,这段代码会简单地工作吗?在我看来,这似乎是可能的。@SvenMarnach从我对NLLs的理解来看,是的,这段代码应该可以简单地工作。NLLs已经在夜间登陆,这确实可以在盒子里工作: