Rust 这个表达式可以简化吗?
我有一个具有6个相同类型字段的结构。我希望能够从枚举中获取对它们的可变引用 例如,给出以下简化定义: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:
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希望现在我已经填好了表达式的开头,剩下的部分就清楚了。谢谢你的编辑。我真的不是故意迟钝;我只是没有意识到枚举变量的名称应该与结构成员的名称相关联。我认为它们都是随意的字母——这可能是其他评论者建议让它们更有意义的部分原因。在“最小”和“完整”之间总是有一个很好的平衡谢谢你明白我的意思,因为我显然没有让它变得容易。也谢谢你提供了一个答案。我希望找到一种不使用不安全的方法,但正如你所指出的,这是必要的。