Хочу хранить мапу с экземплярами реализующими трейт. При этом на месте одного ключа я уверен, что будет всегда лежать экземпляр одной и той же реализации (в данном примере в качестве ключа выступает помимо прочего TypeId). С хранием проблем не возникает, возникает проблема с извлечением элементов.
use std::collections::HashMap;
use std::any::TypeId;
use std::rc::Rc;
trait MyTrait {
fn new() -> Self where Self: Sized;
// Тут ещё какие-нибудь методы
}
struct MyStruct {
items: HashMap<(i32, TypeId), Rc<dyn MyTrait>>
}
impl MyStruct {
fn get<T: MyTrait + 'static>(&mut self, key: i32) -> Rc<T> {
if let Some(item) = self.items.get(&(key, TypeId::of::<T>())) {
item.clone() as Rc<T>
} else {
let item = Rc::new(T::new());
self.items.insert((key, TypeId::of::<T>()), item.clone());
item
}
}
}
Как правильно конвертировать элемент при его извлечении в тип T?