Rust 中相互依赖的通用特征

Generic Traits dependent on each other in Rust

我有两个通用特征需要作为类型参数传递给彼此。代码归结为这个

pub trait Entity<T: EntityRenderer<Self>>
    where Self: Sized
{
    fn get_renderer(&self) -> &T;
}

pub trait EntityRenderer<T: Entity<Self>>
    where Self: Sized
{
    fn get_animation_frame(&T) -> u32;
}

Entity 需要知道 EntityRenderer 是什么类型,反之亦然。后来,我有

entities: Vec<Box<Entity>>

这是个问题,因为我无法解析 Entity 的类型参数。我也不能使任何一个需要类型参数的函数成为通用的,因为 Rust 的编译器不会让具有通用方法的特征成为特征对象。

有什么解决办法吗?还是我违反了某种我不知道的内存安全法?

不能对特征对象执行此操作,因为特征对象会擦除底层对象的真实类型。赠品是,为了在 T 的边界上使用 Self,你需要边界 Self: Sized,但是这个边界禁用了使用特征对象的能力(比如 Box<Entity>).我们甚至还没有解决 Box<Entity> 甚至没有为 Entity.

上的类型参数 T 指定值的事实

看起来 Entity(也许 EntityRenderer 也是)应该使用 an associated type 而不是类型参数。但是,关联类型并不能解决您原来的问题;你会遇到本质上相同的问题,因为你仍然需要 Self: Sized 绑定,因为你需要为特征对象 (Box<Entity<Renderer=???>>) 上的关联类型指定一个值。