Rust 嵌套匹配语句中的非移动可变引用借用

Rust 嵌套匹配语句中的非移动可变引用借用,rust,Rust,作为学习练习的一部分,我正在使用Rust实现编译器。对于编译器的某些部分,我实现了标记窥视以执行高效的解析器替换。为了在Rust中实现这一点,我查看了令牌堆栈,然后在令牌上进行匹配,这将导致一个嵌套的匹配语句,如下所示 // Is there an optional type modifier // Peek at the next token and process it match tokens.last() { Some(token) => match tok

作为学习练习的一部分,我正在使用Rust实现编译器。对于编译器的某些部分,我实现了标记窥视以执行高效的解析器替换。为了在Rust中实现这一点,我查看了令牌堆栈,然后在令牌上进行匹配,这将导致一个嵌套的匹配语句,如下所示

// Is there an optional type modifier
// Peek at the next token and process it
match tokens.last() {
    Some(token) =>
        match token.clone() {
            lexer::Token::OpenBracket => {
                tokens.pop()
            },
            _ => ()

        },
    None => ()
};

我很难找到合适的借阅检查逻辑来将
标记
向量作为可变引用传递到最内部的作用域。我已经尝试过在match语句中使用可变引用重新绑定
标记
,但是编译器仍然将
标记
捕获为不可变的。在本例中,如何获得对最内部作用域的可变
标记
引用?

如果克隆标记无关紧要,可以使用

通过克隆内容(从而删除引用,即取消矢量的镜像),可以再次借用矢量


如果不想克隆,您可以始终执行以下操作:

let mut must_pop = false;

if let Some(token) = tokens.last() {
    match token {
        lexer::Token::OpenBracket => {
            must_pop = true;
        },
        _ => ()
    }
}
if must_pop {
    tokens.pop();
}

这个解决方案不是很“美观”,但至少它是有效的。

@Shepmaster我不明白为什么它是重复的,除非是因为标题。的答案不适用于此问题。@Boiethios“适用于此问题”并不是问题重复的先决条件。如果是的话,我希望会有无限多的“非常接近重复”(例如,“它不是重复的,因为我的变量是
foo
,而那个变量是
bar
”)。我不知道这些问题还会有多少重复-问题的结构完全相同-匹配
Vec::last
的结果并尝试变异向量。
let mut must_pop = false;

if let Some(token) = tokens.last() {
    match token {
        lexer::Token::OpenBracket => {
            must_pop = true;
        },
        _ => ()
    }
}
if must_pop {
    tokens.pop();
}