为什么 |模式匹配中的(管道)会导致“移动后使用的值”?

问题描述 投票:0回答:1

我对匹配臂中管道

|
运算符的语义有点困惑。具体来说,我有一些代码,其中使用管道似乎会导致移动后使用借用检查器错误。

这是一个最小的例子;第一个函数

doesnt_work
将使借用检查器失败,第二个函数 - 看起来与我相同 - 工作得很好。

fn doesnt_work(token_stream: &mut impl Iterator<Item = Token>) {
    for token in token_stream {
        match token {
            Token::ImplicitNode(data) | Token::ExplicitNode(data) =>
                _buildnode(data),
            _ => (),
}   }   }

fn works(token_stream: &mut impl Iterator<Item = Token>) {
    for token in token_stream {
        match token {
            Token::ImplicitNode(data) => _buildnode(data),
            Token::ExplicitNode(data) => _buildnode(data),
            _ => (),
}   }   }

#[derive(Debug, Eq, PartialEq, Clone)]
struct NodeData {}

#[derive(Debug, Eq, PartialEq, Clone)]
enum Token {
    ImplicitNode(NodeData),
    ExplicitNode(NodeData),
    OtherVariantsThatWeArentInterestedIn,
}

fn _buildnode(data: NodeData) { unimplemented!() }

需要明确的是,我不是在问如何修复这个问题;我正在寻求理解为什么借用检查员会抱怨这里的

doesnt_work
实施。

我原以为管道运算符基本上是写出多个相同匹配臂的简写,但显然这是不对的。那么,思考这个问题的正确方法是什么?

rust pattern-matching borrow-checker rustrover
1个回答
0
投票

代码编译得很好;这是 RustRover 借用检查器实现中的一个错误。

© www.soinside.com 2019 - 2024. All rights reserved.