Rust 如何存储实现公共特性的结构(而不是实例)? 出身背景

Rust 如何存储实现公共特性的结构(而不是实例)? 出身背景,rust,Rust,我有一个特点我的特点: 性状我的性状{ fn名称->字符串; fn foo; } name定义了它的名称,foo是它的名称,它为我做了一些工作 目标 我有很多实现这个特性的结构,我想定义一个函数 fn do_workname:&String; 它在结构::name为name的位置查找结构,并调用结构::foo 问题 为了实现我的目标,我需要一个HashMap或use match,但目标值应该是一个struct,而不是实现MyTrait的实例,但这似乎是不可能的 变通办法 将name和foo更改为

我有一个特点我的特点:

性状我的性状{ fn名称->字符串; fn foo; } name定义了它的名称,foo是它的名称,它为我做了一些工作

目标 我有很多实现这个特性的结构,我想定义一个函数

fn do_workname:&String; 它在结构::name为name的位置查找结构,并调用结构::foo

问题 为了实现我的目标,我需要一个HashMap或use match,但目标值应该是一个struct,而不是实现MyTrait的实例,但这似乎是不可能的

变通办法
将name和foo更改为struct方法,即name&self和foo&self,然后使用HashMap或just match来获得正确的结果。但是我认为既然name和foo在设计上不需要一个实例,为什么我需要实例化它呢?

如果您要将一个名称映射到一个动作,那么最有可能使用HashMap。例如:

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");
}

如果hashmap将一个类型名映射到一个函数,您能将其设置为hashmap吗?这样,函数就有责任在映射中插入项,从trait中查找函数,所以您的工作根本不需要了解MyTrait吗?@loganfsmyth这样做有效。非常感谢。酷,我会补充一个答案。