Время жизни ссылки внутри HitRecord
должно быть установлено равным (или меньше) времени жизни & self, чтобы ссылка от record
на self была правильной.Вам даже не нужно явно устанавливать отношение между 'a и' b, потому что не время жизни самого record
имеет значение, а время жизни члена структуры material
.Эта подпись должна работать:
fn hit<'a>(&'a self, ray:&Ray, t_min:f32, t_max:f32, record:&mut HitRecord<'a>) -> bool
Редактировать : Одна вещь, которую я видел, о которой вы могли не знать, это то, что вы создаете объект черты, то есть что-то, что позволяет динамическиотправка.Если вам это не нужно, вы можете изменить объявление HitRecord
на
#[derive(Clone, Copy)]
pub struct HitRecord<'a, T: Material> {
pub t: f32,
pub p: Vector3<f32>,
pub normal: Vector3<f32>,
pub material: Option<&'a T>
}
Таким образом, вы фиксируете структуру для определенного, статически известного типа, реализующего Material
, который включает статические, время компиляции.