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=???>>
) 上的关联类型指定一个值。
我有两个通用特征需要作为类型参数传递给彼此。代码归结为这个
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=???>>
) 上的关联类型指定一个值。