Rust 这个表达式可以简化吗?

Rust 这个表达式可以简化吗?,rust,pattern-matching,Rust,Pattern Matching,我有一个具有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:

我有一个具有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),
}
fn获取参考信息{
配对(&'a mut T,&'a mut T),
相同(&'a mut T T),
}
但据我所知,这将需要我手动指定
(e1,e2)
的所有6*6=36个可能值的结果,这很费劲。有没有办法以更简洁的方式编写此函数


旁白:我定义
S
E
的特殊方式似乎有些奇怪。我有理由在实际代码中使用等效的
COrD
,因此我可以分别引用这些特定字段和相关字段。类似地,
cs
的实际版本也同时引用,因此它们在数组中。

首先编写一个函数,获取对单个成员的引用。然后调用该函数两次:

fn get_ref_mut<'a>(s: &'a mut S, e: E) -> &'a mut i32 {
    match e {
        E::A => &mut s.a,
        E::B => &mut s.b,
        E::COrD(c) => match c {
            COrD::C1 => &mut s.cs[0],
            COrD::C2 => &mut s.cs[1],
            COrD::C3 => &mut s.cs[2],
            COrD::D => &mut s.d,
        }
    }
}

fn get_refs_mut<'a>(s: &'a mut S, e1: E, e2: E) -> RefsMut<'a, i32> {
    if e1 == e2 {
        RefsMut::Same(get_ref_mut(s, e1))
    } else {
        let first: &mut i32 = unsafe {
            &mut *(get_ref_mut(s, e1) as *mut i32)
        };

        let second = get_ref_mut(s, e2);
        RefsMut::Pair(first, second)
    }
}
fn获取参考信息和信息32{
匹配e{
E::A=>&mut s.A,
E::B=>&mut s.B,
E::电源线(c)=>匹配c{
跳线::C1=>&mut s.cs[0],
跳线::C2=>&mut s.cs[1],
跳线::C3=>&mut s.cs[2],
跳线::D=>和mut s.D,
}
}
}

fn获取多个引用您的代码不可读
S
E
或所有一个字符变量都不是命名事物的方法。使用单词而不是字符。你甚至自己也犯了一个错误,请重做一遍,做得更好。@Stargateur我正在建模的实际领域与我的问题无关,所以我想我会尽可能多地删除不必要的细节。这显然适得其反。如果我命名了
S
E
examplestuct
examplenum
,会更容易阅读吗?。谢谢你指出拼写错误。@trentcl希望现在我已经填好了表达式的开头,剩下的部分就清楚了。谢谢你的编辑。我真的不是故意迟钝;我只是没有意识到枚举变量的名称应该与结构成员的名称相关联。我认为它们都是随意的字母——这可能是其他评论者建议让它们更有意义的部分原因。在“最小”和“完整”之间总是有一个很好的平衡谢谢你明白我的意思,因为我显然没有让它变得容易。也谢谢你提供了一个答案。我希望找到一种不使用不安全的方法,但正如你所指出的,这是必要的。