rust - 如何存储实现共同特征的结构(不是实例)?
问题描述
背景
我有一个特点MyTrait
:
trait MyTrait {
fn name() -> String;
fn foo();
}
name
定义了它的名字,并且foo
是它的关联函数,它为我做了一些工作。
目标
我有很多实现这个特征的结构,我想定义一个函数
fn do_work(name: &String);
找到结构TheStruct
where TheStruct::name()
is name
,然后调用TheStruct::foo()
。
问题
为了实现我的目标,我需要一个HashMap
or use match
,但目标值应该是一个 struct (not instance) implements MyTrait
,但这似乎是不可能的。
解决方法
name()
将and更改foo()
为 struct 方法,即name(&self)
and foo(&self)
,然后使用HashMap
or 只是match
为了使事情正确。但我认为既然name()
并且foo()
不需要设计实例,我为什么需要实例化它?
解决方案
如果您要将名称映射到操作,则使用HashMap<String, fn()>
最有可能的最有意义。例如:
use std::collections::{HashMap, hash_map::Entry};
trait MyTrait {
fn name() -> String;
fn foo();
}
struct Example;
impl MyTrait for Example {
fn name() -> String {
"Example".to_string()
}
fn foo() {
println!("Do Example");
}
}
#[derive(Default)]
struct Worker {
handlers: HashMap<String, fn()>,
}
impl Worker {
fn new() -> Self {
Default::default()
}
fn register_handler<T: MyTrait>(&mut self) {
let name = T::name();
match self.handlers.entry(name) {
Entry::Occupied(_) => panic!("handler already registered"),
entry => {entry.or_insert(T::foo);},
}
}
fn do_work(&self, name: &str) {
let handler = self.handlers.get(name).expect("unknown handler");
handler();
}
}
fn main() {
let mut worker = Worker::new();
worker.register_handler::<Example>();
worker.do_work("Example");
}
(游乐场链接)
推荐阅读
- r - 如何根据 R 中列中的最小值选择具有 dplyr/tidyvese 的列
- nfc - 如何知道苹果支付/谷歌支付或智能卡是否与 NFC 读卡器通信
- javascript - 如何高亮选中
- 只有项目?
- python - python什么时候开始使用不同的算法进行大乘法?
- function - “函数调用”和“回调函数”有什么区别?
- ms-access - MS Access VBA - 如何从 Windows 系统语言环境中独立读取 utf8 文本
- sql - 如何为 psql 添加内部查询
- javascript - Laravel - 如何将 php 变量从刀片文件传递给 javascript 函数
- cordova - 用于 Ionic 的 OverAppBrowser
- c - 如何从 objdump 读取汇编代码输出