我有以下代码,其中枚举Message
的每个变体都有一个Term
值与之关联:
type Term = usize;
pub enum Message {
AppendRequest(Term),
AppendResponse(Term),
VoteRequest(Term),
VoteResponse(Term),
}
impl Message {
pub fn term(&self) -> Term {
match *self {
Message::AppendRequest(term) => term,
Message::AppendResponse(term) => term,
Message::VoteRequest(term) => term,
Message::VoteResponse(term) =>term,
}
}
}
我想,如果Message
能够获得其术语而无需解构我所拥有的实际Message
值。我能想到的最好的事情就是创建一个为我解开价值的公共功能,但这感觉很笨拙。如果我添加新的枚举值,我将不得不记得在term
函数中更新匹配语句。
是否有更简洁/符合人体工程学的方式来表达上面的代码?有什么方法可以说"嘿,这个枚举的每个值都会有一个Term
值与之相关联。
答案 0 :(得分:13)
有没有办法说“嘿,这个枚举的每个值都会有一个
sim
值。
没有。这通常通过将Term
拆分为两部分来处理,其中enum
包含所有常见部分:
struct
答案 1 :(得分:0)
一种选择是实现 Deref
(和/或 DerefMut
)特征以转换为公共部分。
每次添加到 Enum 时,您仍然需要更新该实现,但在使用点的样板文件较少。
例如,下面的示例,请注意 main
访问 Enum 上的字段 number
。
use std::ops::Deref;
use std::string::String;
enum JudgedNumber {
GoodNumber(Number),
BadNumber(Number, String),
}
struct Number { number: i32 }
fn main() {
let nice = JudgedNumber::GoodNumber(Number{number: 42});
let naughty = JudgedNumber::BadNumber(
Number{number: 666}, "Damn you to hell".to_string());
println!("j1 = {}", j1.number);
println!("j2 = {}", j2.number);
}
impl Deref for JudgedNumber {
type Target = Number;
fn deref(&self) -> &Number {
match self {
JudgedNumber::GoodNumber(n) => n,
JudgedNumber::BadNumber(n, _) => n,
}
}
}
这是我从https://github.com/rust-embedded/svd/blob/master/src/svd/cluster.rs
那里学到的