Rust 嵌套匹配语句中的非移动可变引用借用
作为学习练习的一部分,我正在使用Rust实现编译器。对于编译器的某些部分,我实现了标记窥视以执行高效的解析器替换。为了在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
// 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();
}