【问题标题】:Generic Traits dependent on each other in RustRust 中相互依赖的通用特征
【发布时间】:2017-03-29 02:19:34
【问题描述】:

我有两个需要作为类型参数相互传递的通用特征。代码归结为这一点

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 的编译器不会让具有泛型方法的特征成为特征对象。

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

【问题讨论】:

    标签: generics rust traits


    【解决方案1】:

    您不能对 trait 对象执行此操作,因为 trait 对象会擦除底层对象的真实类型。赠品是,为了在T 的边界上使用Self,您需要绑定Self: Sized,但这个边界会禁用使用特征对象的能力(如Box&lt;Entity&gt;)。我们甚至还没有解决Box&lt;Entity&gt; 甚至没有为Entity 上的类型参数T 指定值这一事实。


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

    【讨论】:

    • 感谢您的回答。那么,是否不鼓励使用泛型?
    • 泛型和相关类型都有它们的用途。当实现决定类型时,关联类型最适合。当单个类型可以实现泛型特征的多个实例时,您通常会创建一个泛型特征(例如From&lt;T&gt;)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    相关资源
    最近更新 更多