Как использовать объект признака для ссылки на структуру, которая имеет общие методы

В связи с этим вопросом, храня замыкание в 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!");
}

Однако возвращаемая ошибка говорит о том, что IObject не может быть объектом-признаком, поскольку он содержит метод с общими параметрами. Тем не менее, чтобы передать замыкание на функцию вообще, мне нужны шаблоны. Может ли кто-нибудь показать мне, как добиться абстракции, которую я ищу, при этом все еще имея возможность передавать замыкания в функции?

1 ответ

Решение

Вы не можете обойти это; статическая и динамическая отправка не смешиваются. Мономорфизация, которую выполняет статическая диспетчеризация (generics), просто не может работать с виртуальной таблицей, используемой в динамической диспетчеризации (trait-объекты).

Один из двух должен будет пойти: либо использование IObject в качестве объекта признака или аргумента обобщенной функции, в пользу принятия Box<FnMut(&Event) + 'a>,

Кстати, обратите внимание, как ваш IObject реализация не соответствует признаку - этот признак не дает срока жизни, связанного с Fгде ваша реализация делает. Вам нужно добавить 'a в любом случае как универсальный в определении черты (общее время жизни в порядке с объектными чертами).

Другие вопросы по тегам