如何将枚举分成两个不同的板条箱?

时间:2016-08-15 20:46:40

标签: rust

我在这里开始:

#[derive(PartialEq)]
enum ControlItem {
    A {
        name: &'static str,
    },
    B {
        name: &'static str,
    },
}

struct Control {
    items: Vec<(ControlItem, bool)>,
}

impl Control {
    pub fn set(&mut self, item: ControlItem, is_ok: bool) {
        match self.items.iter().position(|ref x| (**x).0 == item) {
            Some(idx) => {
                self.items[idx].1 = is_ok;
            }
            None => {
                self.items.push((item, is_ok));
            }
        }
    }

    pub fn get(&self, item: ControlItem) -> bool {
        match self.items.iter().position(|ref x| (**x).0 == item) {
            Some(idx) => return self.items[idx].1,
            None => return false,
        }
    }
}

fn main() {
    let mut ctrl = Control { items: vec![] };
    ctrl.set(ControlItem::A { name: "a" }, true);
    assert_eq!(ctrl.get(ControlItem::A { name: "a" }), true);
    ctrl.set(ControlItem::B { name: "b" }, false);
    assert_eq!(ctrl.get(ControlItem::B { name: "b" }), false);
}

我有一个Control类型,可以保存某些预定义项目的状态并将其报告给用户。

我脑子里有一张虚拟表,如下所示:

|Name in program | Name for user             |
|item_1          | Item one bla-bla          |
|item_2          | Item two bla-bla          |
|item_3          | Item three another-bla-bla|
  1. 我希望Control拥有get / set方法,这些方法只接受名称为item_1item_2item_3的内容

  2. 我想把这个虚拟桌子放在两个箱子里:&#34; main&#34;和&#34;平台&#34;。 Control的大多数实现应该在主箱中,并且项目的定义(如item_3)应该放入平台包。我想在编译时注册item_3

  3. 关于如何实现这一点的任何想法?

1 个答案:

答案 0 :(得分:0)

听起来你应该使用特征,而不是枚举。你可以定义一个特征并像这样实现它:

pub trait ControlItem {
    fn name(&self) -> &str;
}

struct A(&'static str);

impl ControlItem for A {
    fn name(&self) -> &str {
        self.0
    }
}

// ... similar struct and impl blocks for other items

然后这些结构可以移动到单独的板条箱中。

您需要更改Control以存储Vec<(Box<ControlItem>, bool)>,并更改getset以获取Box<ControlItem>,或者是通用的超过T: ControlItem

了解更多信息,请阅读traitstrait objects