在 Rust 模式匹配中将变量绑定到文字

Der*_*ric 2 pattern-matching rust

我有一个用 Rust 编写的状态机,它需要对两个状态执行相同的操作。

这两种状态都是枚举的变体,但包含不同数量的元素。

match self.state {
    RunState::ACCUMULATE(byte, count) | RunState::ESCAPE(count) => todo!(), 
    _ => todo!()
}
Run Code Online (Sandbox Code Playgroud)

该示例是无效的源代码,因为byte未绑定在所有模式中。

这可以通过byte在第二个模式中绑定到文字零来解决,但我不知道如何存档。

我目前正在分别匹配这两种模式,这会导致我想避免的代码重复。

感谢您的关注。

kmd*_*eko 5

模式旨在通过结构进行匹配,并根据匹配的值绑定变量。它并不是为了引入任意绑定而设计的。match如果您担心重复,您应该使用单独的手臂,也许还可以使用辅助函数:

match self.state {
    RunState::ACCUMULATE(byte, count) => helper(byte, count),
    RunState::ESCAPE(count) => helper(0, count), 
    ...
}
Run Code Online (Sandbox Code Playgroud)

enum或者您可以为您引入一个返回所需值的函数,例如:

impl RunState {
    fn to_parts(&self) -> (u8, usize) { // or Option<(u8, usize)> if its not applicable to all
        match self.state {
            RunState::ACCUMULATE(byte, count) => (byte, count),
            RunState::ESCAPE(count) => (0, count), 
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)