我试图编写一个kd树实现,但我一直收到错误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(),
}
}
我需要在KDTree上实现复制吗?难道这不需要大量的cpu/内存来复制整个东西吗?
最佳答案
代码需要KDTree所有权的原因是您正在调用Option::expect
和Option::unwrap
。这些文档可以找到here。
impl<T> Option<T> {
fn unwrap(self) -> T {
...
}
}
因此,当您调用unwrap(或expect)时,编译器正确地抱怨您正在按值获取结构的元素。要解决此问题,请使用
Option::as_ref
method。impl<T> Option<T> {
fn as_ref(&self) -> Option<&T> {
...
}
}
这将把对选项的引用转换为不需要所有权的可选引用。您可以在函数的签名中看到这一点-它采用
&self
而不是self
。pub fn direct_samples(&self) -> Vec<u32> {
assert!(self.objects.is_some());
let mut direct_samples = Vec::new();
for (i, object) in self.objects.as_ref()
.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.as_ref().unwrap().direct_samples());
}
if self.right.is_some() {
direct_samples.extend(self.right.as_ref().unwrap().direct_samples());
}
direct_samples
}
我需要在KDTree上实现复制吗?难道这不需要大量的cpu/内存来复制整个东西吗?
您不能在您的
Copy
上实现KDTree
,因为它包含堆分配的内存(框)-Copy
意味着您的类型可以通过复制其字节来复制,但在这种情况下,如果不使单个所有权失效,则无法实现。关于compilation - 我不明白借贷的方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40372763/