生锈中是否可能具有大小特征的多态性

Is polymorphism with sized traits possible in rust

我正在使用一个公开特征的库,该特征要求它是 Sized

我正在使用一个实现此特征的对象,并试图创建一个包含所有这些实例的数组。对于非大小特征,我会使用类似 Vec<Box<dyn MyNonSizedTrait>> 的东西,但是对于 Sized 特征,这是不可能的,编译器会抱怨 the trait MySizedTrait cannot be made into an object.

有什么办法可以解决这个问题吗?

这是我正在尝试做的一个例子:

trait A: Sized {
    fn do_something(&self);  
}
    
struct B;

impl A for B {
    fn do_something(&self){
        println!("This is B")
    }
}
    
struct C;
    
impl A for C {
    fn do_something(&self) {
        println!("This is C")
    }
}
    
    
fn my_do_something(d: &[Box<dyn A>]) {
    for i in d {
        i.do_something(); 
    }
}
    
fn main() {
    let mut d: Vec<Box<dyn A>> = Vec::new();
    d.push(Box::new(B));  
    d.push(Box::new(C)); 
    my_do_something(&d); 
}

dyn Trait 根据定义总是未调整大小,因为它允许其后面的对象具有从 0isize::MAX.

的任何大小

要拥有固定大小的对象和多态性,请使用 enum。然后,您可以在 enum 本身上添加 impl 以分派对变体的调用。有一些 hacky crates 可以自动执行此操作。