Enums 在所有枚举值中共享公共值
我有以下代码,其中enumEnums 在所有枚举值中共享公共值,enums,rust,Enums,Rust,我有以下代码,其中enum消息的每个变量都有一个与之关联的术语值: type Term = usize; pub enum Message { AppendRequest(Term), AppendResponse(Term), VoteRequest(Term), VoteResponse(Term), } impl Message { pub fn term(&self) -> Term { match *self {
消息的每个变量都有一个与之关联的术语
值:
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,
}
}
}
我想,给定一个消息
就能够得到它的术语,而不必解构我拥有的实际消息
值。我能想到的最好办法就是创建一个公共函数,为我解压价值,但这感觉很笨拙。如果我添加了一个新的枚举值,我必须记住在函数中更新match语句
有没有更简洁/符合人体工程学的方法来表达上述代码?是否有某种方式可以说“嘿,这个枚举的每个值都将有一个与之关联的术语
值?”
是否有某种方式可以说“嘿,这个枚举的每个值都将有一个与之关联的术语
值?”
不可以。这通常是通过将enum
分为两部分来处理的,其中struct
包含所有公共部分:
pub struct Message {
term: Term,
kind: MessageKind,
}
pub enum MessageKind {
AppendRequest,
AppendResponse,
VoteRequest,
VoteResponse,
}
一个选项是实现Deref
(和/或DerefMut
)特性以转换为公共零件
每次添加到Enum时,您仍然必须更新该实现,但在使用点的样板文件较少
例如,下面的一个示例,请注意main
访问枚举上的字段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,
}
}
}
我从中学到这一点,我必须记住更新术语函数中的match语句-编译器会提醒您这一点。@Shepmaster当然。编者会明白的。也许我应该说的是“现在每次有变化时,我都要在两个地方更新代码,感觉好像我做错了什么”。太好了。这正是我想要的。