Я пытаюсь написать реализацию кД-дерева, но я получаю ошибку cannot move out of borrowed content.
Я не понимаю, как заимствование работает
Это мой KDTree структура
pub struct KDTree {
pub bounding_box: Aabb,
pub axis: Option<Axis>,
left: Option<Box<KDTree>>,
right: Option<Box<KDTree>>,
pub objects: Option<Vec<Box<Geometry>>>,
}
Этот метод, однако, , выдает эту ошибку.
pub fn direct_samples(&self) -> Vec<u32> {
assert!(self.objects.is_some());
let mut direct_samples = Vec::new();
for (i, object) in self.objects
.expect("Expected tree to have objects")
.iter()
.enumerate() {
if object.material().emittance > 0f32 {
direct_samples.push(i as u32);
}
}
if self.left.is_some() {
direct_samples.extend(self.left.unwrap().direct_samples());
}
if self.right.is_some() {
direct_samples.extend(self.right.unwrap().direct_samples());
}
direct_samples
}
Я понимаю, что если изменить параметр на self
вместо &self
, он должен работать, но потом, когда я звоню, он дает ошибку use of moved value.
pub fn from_objects(objects: Vec<Box<Geometry>>) -> Scene {
let tree = KDTree::from_objects(objects);
Scene {
camera: Camera::new(),
objects: tree,
direct_samples: tree.direct_samples(),
}
}
Мне нужно реализовать Copy Do на моем KDTree? Не будет ли это использовать много процессора/памяти для копирования всего?
Помимо этого: 'Опция' кажется подозрительной, 'Vec' уже может быть пустым, поэтому перенос ее в« Option », который вы затем утверждаете, не должен существовать, кажется довольно бесполезным. Даже если 'Нет' и' Некоторые (empty_vec) 'действительно означают что-то другое, это довольно запутанное различие. –
delnan