我在这里开始:
#[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|
我希望Control
拥有get
/ set
方法,这些方法只接受名称为item_1
,item_2
,item_3
的内容
我想把这个虚拟桌子放在两个箱子里:&#34; main&#34;和&#34;平台&#34;。 Control
的大多数实现应该在主箱中,并且项目的定义(如item_3
)应该放入平台包。我想在编译时注册item_3
。
关于如何实现这一点的任何想法?
答案 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)>
,并更改get
和set
以获取Box<ControlItem>
,或者是通用的超过T: ControlItem
。
了解更多信息,请阅读traits和trait objects。