Enums 在所有枚举值中共享公共值

Enums 在所有枚举值中共享公共值,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 {

我有以下代码,其中enum
消息的每个变量都有一个与之关联的
术语
值:

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当然。编者会明白的。也许我应该说的是“现在每次有变化时,我都要在两个地方更新代码,感觉好像我做错了什么”。太好了。这正是我想要的。