std::future::Future;
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
pub type FutType = Pin<Box<dyn Future<Output=()>>>;
pub type HandlerType = fn(Arc<Mutex<Box<dyn Any>>>, Bytes) -> FutType;
struct MyStruct;
impl MyStruct {
fn do_something(arc_self: Arc<Mutex<Box<Self>>>, data: Bytes) -> FutType {
Box::pin(async move {})
}
}
fn main() {
let mut handlers: HashMap<i32, HandlerType> = HashMap::new();
handlers.insert(1, MyStruct::do_something);
}
Хочу мапку с указателями на методы структур разных и дергать их в зависимости от того, какой пришёл ключ
Во-пепвых на 13 строке Box<Self>, а в HandlerType Box<dyn Any>. Self == MyStruct, а MyStruct это не trait object. Можно написать Box<dyn MyStruct>` в 13 строке, но зачем тут нужен trait object? Почему нельзя использовать дженерик просто? Во-вторых скастовать к нужному типу функцию можно, если она автоматически не скастуется к fn pointer. Но если исправить ошибку на 13 строке, наверное автоматически скастуется.
Дженерик нельзя, потому что структуры, которые будут это обрабатывать, разные
вот так оно компилируется https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=eacf6ba008d6733448c1c40e5668ddf4
Обсуждают сегодня