作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这里是我的起点:
#[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
.
我想将这个虚拟表保存在两个 crate 中:“main”和“platform”。 Control
的大部分实现应该放在主包中,项目的定义(如 item_3
)应该放在平台包中。我想在编译时注册item_3
。
关于如何实现这一点有什么想法吗?
最佳答案
听起来您应该使用特征,而不是枚举。您可以定义一个特征并像这样实现它:
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
然后可以将这些结构移到单独的 crate 中。
您需要更改 Control
存储 Vec<(Box<ControlItem>, bool)>
, 或者改变 get
和 set
采取Box<ControlItem>
,或者在 T: ControlItem
上通用.
了解 traits和 trait objects了解更多。
关于rust - 如何将一个枚举分成两部分放在不同的 crate 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38962797/
我是一名优秀的程序员,十分优秀!