У меня есть следующая Rust Playground постоянная ссылка
, что из моих следующих Трассировка лучей в выходные .
В момент реализации материалов я решил создать черту Material
.
Я думал, что объекты в мире будут иметь атрибут material
и луч Hit
Hit
может посмотреть на объект и запросить материал по запросу. Это хорошо работает для моей черты Normal
, которая следует за подобным мышлением. Я реализовал все это с помощью динамической c отправки, хотя я думаю, что у меня достаточно asp, чтобы сделать это статически и с границами черт.
В связанном коде вы видите строку 13, я запрашиваю эти которые реализуют Normal
, имеют метод, который будет возвращать Material
. Тогда это говорит о том, что теперь Normal
больше не может быть объектом черты error[E0038]: the trait
Обычный cannot be made into an object
Если я правильно понимаю из таких вопросов, как это , кажется, что, поскольку дженерики мономорфизированы ли среда выполнения Rust, возможно, не утечка подходящего метода для material
, учитывая, что якобы может быть один для каждого типа, реализующего Normal
? Это меня не совсем устраивает, так как кажется, что, поставив в то же положение, что и среда выполнения Rust, я мог бы взглянуть на тот инструмент реализации Normal
, который у меня под рукой, скажем Sphere
и сказать, что я будет выглядеть в таблице Sphere
. Не могли бы вы объяснить, где я здесь не прав?
Оттуда я попытался просто бороться с компилятором и отправился на stati c dispatch. линии 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,
}
, и оттуда я остаюсь, пытаясь заткнуть отверстие за отверстием так, что кажется, что конца не видно.
Какие варианты дизайна я могу сделать по-другому, помимо изучения того, что в корне не так с моим нынешним пониманием?