Поскольку вы хотите задать тип параметра для типа Box
, правильный синтаксис будет Box::<dyn MyTrait>::new
, а не Box::new::<dyn MyTrait>
.Однако это также не будет работать, так как компилятор попытается привести тип аргумента к Box::new()
к dyn MyTrait
, прежде чем передать его по значению, что невозможно для динамически изменяемых типов.Сначала вы должны создать блок, и только потом вы можете выполнить принудительное приведение к размеру, чтобы у вас был хороший код.Вот альтернатива, которая по сути та же самая, просто написана немного более кратко:
let mut my_trait_vec: Vec<Box<dyn MyTrait>> = my_vec
.into_iter()
.map(|x| Box::new(x) as Box<dyn MyTrait>)
.collect();
Еще один вариант - определить вспомогательную функцию, например,
fn into_boxed_trait<T>(value: T) -> Box<dyn MyTrait>
where
T: MyTrait + 'static,
{
Box::new(value)
}
Это позволит вамнаписать
let mut my_trait_vec: Vec<_> = my_vec
.into_iter()
.map(into_boxed_trait)
.collect();