Вы не можете. Концептуально, ничто не мешает вам делать o = Op::Add
между внешним совпадением и внутренним совпадением. Для варианта вполне возможно переключаться между двумя матчами.
Я бы, вероятно, следовал коду Stargateur , но если вы не хотите реструктурировать свой enum, помните, что в Rust есть несколько методов абстракции. Например, функции довольно хороши для повторного использования кода, а замыкания (или признаки) хороши для настройки логики.
enum Op {
LoadX,
LoadY,
Add,
}
fn load<R>(f: impl FnOnce() -> R) {
print!("Loading ");
f();
println!("...");
}
fn test(o: Op) {
match o {
Op::LoadX => load(|| print!("x")),
Op::LoadY => load(|| print!("y")),
Op::Add => println!("Adding"),
}
}
fn main() {
test(Op::LoadX);
test(Op::LoadY);
test(Op::Add);
}
Должен ли я просто поставить panic!("shouldn't happen")
Вы должны использовать unreachable!
вместо panic!
, так как это более семантически правильно для программиста.