Допустим, у меня есть enum
с несколькими вариантами:Аналогичные, но различные совпадения положения
#[derive(Copy,Clone)]
enum Foo {
Left(isize),
Right(isize),
Other,
//...
}
И я хочу, чтобы шаблон матч на этом, с очень похожим, но не идентичным лечения Left
и Right
.
Я закончил с:
match foo {
Left(i) | Right(i) => {
let i2 = match foo {
Left(_) => -i,
Right(_) => i,
_ => unreachable!(),
};
move_sideways(i2);
// non-trivial code, ie not a simple function call
},
Other => { ... }
}
который не очень удовлетворительным, и опирается на не потребляя foo
в первый раз. Есть ли хорошая идиома, которую я пропускаю, чтобы избежать повторного сопоставления или дублирования правила?
Я не могу придумать лучшего способа сделать это. Однако взгляните на свой тип: 'Left (3)' и 'Right (-3)' будут кодировать точно такую же информацию, не так ли? Таким образом, ваш тип несколько избыточен. Возможно, вы могли бы просто заменить 'Left' и' Right' на 'Sideways (isize)'. Конечно, он не решает, о чем вы просите, но * я думаю, что тип должен быть переработан ... Или я не прав? –
Это просто недостаток моего упрощенного примера. Реальный тип - nom :: Input. –