Типы Box<dyn Model>
и Box<User>
не являются взаимозаменяемыми. Коллекции, содержащие одну, не могут быть непосредственно преобразованы в другую, даже с небезопасным кодом. Эти типы разные и имеют разные представления в памяти. Они даже имеют разные размеры:
println!("{}", std::mem::size_of::<Box<User>>()); // 8
println!("{}", std::mem::size_of::<Box<dyn Model>>()); // 16
Единственный способ конвертировать из Vec<Box<User>>
в Vec<Box<dyn Model>>
- это поэтапно. Каждый предмет должен быть приведен в соответствие с этим:
let model: Box<dyn Model> = user;
Или:
let model = Box::<dyn Model>::from(user);
В результате получается эта уродливая вещь:
tables.insert(
"users".to_string(),
users
.iter()
.map(|user| Box::<dyn Model>::from(user))
.collect()
);
Если вам не нужноИсходный вектор после этого, вы избегаете клонирования, делая его изменчивым и сливая вместо этого:
tables.insert(
"users".to_string(),
users
.drain(..)
.map(|user| Box::<dyn Model>::from(user))
.collect(),
);