【发布时间】:2020-04-25 02:55:07
【问题描述】:
我有以下 Rust Playground permalink
来自我的关注Ray Tracing in a Weekend。
在实现材料时,我选择创建一个特征Material。
我的想法是,世界上的物体将具有material 属性,并且在射线上Hit Hit 可以查看物体并按需请求材料。这适用于我的 Normal 特质,它遵循类似的想法。我用动态调度实现了这一切,尽管我认为我已经掌握了足够的能力,也可以用 trait bounds 静态地完成它。
在链接代码中,您会看到第 13 行,我要求那些实现 Normal 的人有一个返回 Material 的方法。这表明现在Normal 不再有资格成为特征对象error[E0038]: the traitNormalcannot be made into an object
如果我从this 这样的问题中正确理解,似乎由于泛型是单态的,Rust 运行时不可能泄露material 的适当方法,因为表面上可能对于实现@ 的每种类型都有一个不同的方法987654335@?这似乎不太符合我的要求,因为看起来,放在与 Rust 运行时相同的位置,我将能够查看我手头的 Normal 实现者,比如 Sphere 并说我将查看Sphere 的vtable。你能解释一下我在哪里错了吗?
从那里,我尝试简单地与编译器抗争并进行静态调度。 第 17-21 行
struct Hit<'a> {
point: Vec3,
distance: f32,
object: &'a dyn Normal,
}
成为
struct Hit<'a, T: Normal> {
point: Vec3,
distance: f32,
object: &'a T,
}
从那里开始,我试图一个接一个地堵住一个又一个洞,似乎看不到尽头。
除了了解我目前的理解存在根本性错误之外,我还可以做哪些不同的设计选择?
【问题讨论】: