如何使用特征对象来引用具有泛型方法的struct

Fat*_*sis 5 rust

关于这个问题,在一个HashMap中存储一个闭包,我了解到正确地将闭包传递给一个函数需要该函数是通用的,并采用任何实现Fn,FnMut或FnOnce特性的类型.

在从C++实现库的一部分作为学习练习时,我需要一些像这样的类型抽象.

use std::collections::HashMap;

struct Event;

trait IObject {
    fn makeFunc<F : FnMut(&Event)>(&mut self, s : &str, f : F);
}

struct Object1<'a> {
    m_funcs : HashMap<String, Box<FnMut(&Event) + 'a>>
}

impl <'a> Object1<'a> {
    fn new() -> Object1<'a> {
        Object1 {m_funcs : HashMap::new()}
    }
}

impl <'a> IObject for Object1<'a> {
    fn makeFunc<F : FnMut(&Event) + 'a>(&mut self, s: &str, f: F) {
        self.m_funcs.insert(String::from_str(s), Box::new(f));
    }
}

fn main() {
    let obj : &IObject = &Object1::new();
    println!("Hello, world!");
}
Run Code Online (Sandbox Code Playgroud)

但是,返回的错误表明IObject不能是特征对象,因为它包含带有泛型参数的方法.但是,要将闭包传递给函数,我需要泛型.有人能告诉我如何实现我正在寻找的抽象,同时仍然能够将闭包传递给函数吗?

Chr*_*gan 6

你不能绕过这个; 静态和动态调度不混合.静态调度(泛型)所做的单态化无法与动态调度(特征对象)中使用的vtable一起使用.

其中一个必须去:要么使用IObject作为特征对象,要么使用泛型函数参数,而不是接受a Box<FnMut(&Event) + 'a>.

顺便说一下,请注意您的IObject实现如何与特征不匹配 - 特征不会给F您的实现带来生命周期限制.'a无论如何,您需要在特征定义上添加通用(对于特征对象,通用生命周期是正常的).