我对匹配臂中管道
|
运算符的语义有点困惑。具体来说,我有一些代码,其中使用管道似乎会导致移动后使用借用检查器错误。
这是一个最小的例子;第一个函数
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
实施。
我原以为管道运算符基本上是写出多个相同匹配臂的简写,但显然这是不对的。那么,思考这个问题的正确方法是什么?
代码编译得很好;这是 RustRover 借用检查器实现中的一个错误。