Как трейт положить в HashMap?

Хочу положить трейт в хешмапу? И чтобы мапа владела ими.
Ругается, что не реализован std::marker::Sized

struct s1 { field: i8, }

trait t_do_some{ 
    fn do_some(&self); 
}

impl t_do_some for s1{ 
    fn do_some(&self){} 
}

let mut all_objects1:HashMap<i32, t_do_some> = HashMap::new();

Ругается так:

    |
245 |     let mut all_objects1:HashMap<i32, t_do_some> = HashMap::new();
    |                          ^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Sized` is not implemented for `t_do_some`
    |
    = note: `t_do_some` does not have a constant size known at compile-time
    = note: required by `std::collections::HashMap`

Разумеется, размер неизвестен. Там же могут быть разные структуры с разным размером.
И я понимаю, что можно создать енум, в котором перечислено все, что может в мапе лежать, и положить в хешмапу этот енум. Но может есть способ проще?

Обычно в Box упаковывают:

https://play.rust-lang.org/?gist=f0aaa1f2dcc13521c52168da346e3072

1 лайк

Box выделяет память в хипе. А можно так, чтобы без этого?

Можно в хэш-таблицу сложить ссылки на расположенные где-то в другом месте объекты:

https://play.rust-lang.org/?gist=b2a71f7e19e5825fadf086e191b2311f

Но в таблицу можно положить только что-то, размер чего известен - сами структуры, перечисления, box-ссылки на объекты и т.п.