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

时间:2018-03-09 04:46:45

标签: enums rust

我有以下代码,其中枚举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值与之相关联。

2 个答案:

答案 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

那里学到的