此问题已被删除。
实现此目的的一种方法是创建一个
Cpu<State>
,然后为每个状态创建一个结构体来承载所有特定于状态的数据,并为每个状态编写一个 impl
以提供转换到下一个状态的方法。
struct Cpu<State> {
data: Vec<u16>,
state: State,
}
struct State1 {
foo: String
}
struct State2 {
bar: usize
}
impl Cpu<State1> {
fn transition(self) -> Cpu<State2> {
let Self { data, state: State1 { foo } } = self;
let bar = foo.len();
Cpu { data, state: State2 { bar } }
}
}
您基本上已经在类型系统中编码了枚举变体。状态之间的有效转换作为方法公开,无效的转换无法表示。