У меня есть структура с 6 полями одного типа. Я хочу быть в состоянии получить изменяемые ссылки на них из перечисления.
Например, с учетом следующих упрощенных определений:
struct S {
a: i32,
b: i32,
cs: [i32; 3],
d: i32,
}
enum E {
A,
B,
COrD(COrD)
}
enum COrD {
C1,
C2,
C3,
D,
}
Я хочу написать такую функцию:
fn get_refs_mut<'a, T>(s: &'a mut S, e1: E, e2: E) -> RefsMut<'a, i32> {
match (e1, e2) {
(E::A, E::A) => RefsMut::Same(&mut S.a),
(E::A, E::B) => RefsMut::Pair(&mut S.a, &mut S.b),
(E::B, E::COrD(COrD::C1)) => RefsMut::Pair(&mut S.b, &mut S.c[0])
// ...
(E::B, E::A) => RefsMut::Pair(&mut S.b, &mut S.a),
(E::B, E::B) => RefsMut::Same(&mut S.b),
(E::B, E::COrD(COrD::C1)) => RefsMut::Pair(&mut S.b, &mut S.c[0]),
// ...
(E::COrD(COrD::D), E::COrD(COrD::D)) => RefsMut::Same(&mut S.d),
}
}
enum RefsMut<'a, T> {
Pair(&'a mut T, &'a mut T),
Same(&'a mut T),
}
Но, насколько я могу судить, для этого потребуется вручную указать результаты для всех 6 * 6 = 36 возможных значений для (e1, e2)
, что является трудоемким. Есть ли способ написать эту функцию более кратко?
В сторону: конкретный способ, которым я определил S
и E
, может показаться странным. У меня есть причины иметь эквивалент COrD
в реальном коде, поэтому я могу ссылаться на эти конкретные поля и связанные поля отдельно. Точно так же реальные версии cs
также упоминаются вместе, следовательно, они находятся в массиве.