借用并赋值给 &reference 后面的值
Borrow and assign to values behind & reference
所以我试图在 Rust 中制作我自己的八叉树,但我在使用 set
函数时遇到了问题。它应该是递归的,并且有一点我正在匹配子节点。除了,它有两个错误:
- 它不能借用一个子元素作为可变的,因为它在 & 引用后面。
- 我不知道如何创建一个新的子项(如果它确实存在)。由于我的
Octree
包含对子 Octree
的引用,如果我尝试将引用设置为新的引用,它会删除该值。
我有点不知所措。我是否需要创建特征然后为根、分支和叶创建类型?或者有没有办法保存我的代码?
破坏的代码:
match self.children[index] { // Here it says I can't borrow it
Some(ref mut child) => {
child.set(pos, val);
},
None => {
let mut new_pos = self.pos.clone();
let new_size = self.size.clone() as i32/2 ;
match index {
0 => { new_pos[0] -= new_size.clone(); new_pos[0] -= new_size.clone(); new_pos[0] -= new_size.clone(); },
1 => { new_pos[0] -= new_size.clone(); new_pos[0] -= new_size.clone(); new_pos[0] += new_size.clone(); },
2 => { new_pos[0] -= new_size.clone(); new_pos[0] += new_size.clone(); new_pos[0] -= new_size.clone(); },
3 => { new_pos[0] -= new_size.clone(); new_pos[0] += new_size.clone(); new_pos[0] += new_size.clone(); },
4 => { new_pos[0] += new_size.clone(); new_pos[0] -= new_size.clone(); new_pos[0] -= new_size.clone(); },
5 => { new_pos[0] += new_size.clone(); new_pos[0] -= new_size.clone(); new_pos[0] += new_size.clone(); },
6 => { new_pos[0] += new_size.clone(); new_pos[0] += new_size.clone(); new_pos[0] -= new_size.clone(); },
7 => { new_pos[0] += new_size.clone(); new_pos[0] += new_size.clone(); new_pos[0] += new_size.clone(); }
_ => { panic!("Index out of bounds"); }
}
let mut new_tree = Octree::new(new_size.clone() as u8, new_pos);
new_tree.set(pos, val);
*self.children[index] = Some(new_tree); // Here it says I can't write to it
}
}
引用也被称为借用;它们的主要目的是临时,“借用”一个值被其他东西拥有。
定义数据结构时,它几乎不应该包含引用;相反,应该使用 owned 类型。有时这意味着写 T
而不是 &'a T
;在这种情况下,由于结构是递归的,它需要一个指针,但是一个拥有的而不是借用的——即 Box
.
更改您的结构定义
pub struct Octree<'a, T> {
children: [&'a Option<Octree<'a, T>>; 8],
data: Option<T>,
size: u8,
pos: VecI3
}
到
pub struct Octree<T> {
children: [Option<Box<Octree<T>>>; 8],
data: Option<T>,
size: u8,
pos: VecI3
}
请注意,该结构不再具有生命周期参数——就像 BTreeMap
(标准库中的递归结构)一样。
然后要插入子节点,您需要使用:
*self.children[index] = Some(Box::new(new_tree));
所以我试图在 Rust 中制作我自己的八叉树,但我在使用 set
函数时遇到了问题。它应该是递归的,并且有一点我正在匹配子节点。除了,它有两个错误:
- 它不能借用一个子元素作为可变的,因为它在 & 引用后面。
- 我不知道如何创建一个新的子项(如果它确实存在)。由于我的
Octree
包含对子Octree
的引用,如果我尝试将引用设置为新的引用,它会删除该值。
我有点不知所措。我是否需要创建特征然后为根、分支和叶创建类型?或者有没有办法保存我的代码?
破坏的代码:
match self.children[index] { // Here it says I can't borrow it
Some(ref mut child) => {
child.set(pos, val);
},
None => {
let mut new_pos = self.pos.clone();
let new_size = self.size.clone() as i32/2 ;
match index {
0 => { new_pos[0] -= new_size.clone(); new_pos[0] -= new_size.clone(); new_pos[0] -= new_size.clone(); },
1 => { new_pos[0] -= new_size.clone(); new_pos[0] -= new_size.clone(); new_pos[0] += new_size.clone(); },
2 => { new_pos[0] -= new_size.clone(); new_pos[0] += new_size.clone(); new_pos[0] -= new_size.clone(); },
3 => { new_pos[0] -= new_size.clone(); new_pos[0] += new_size.clone(); new_pos[0] += new_size.clone(); },
4 => { new_pos[0] += new_size.clone(); new_pos[0] -= new_size.clone(); new_pos[0] -= new_size.clone(); },
5 => { new_pos[0] += new_size.clone(); new_pos[0] -= new_size.clone(); new_pos[0] += new_size.clone(); },
6 => { new_pos[0] += new_size.clone(); new_pos[0] += new_size.clone(); new_pos[0] -= new_size.clone(); },
7 => { new_pos[0] += new_size.clone(); new_pos[0] += new_size.clone(); new_pos[0] += new_size.clone(); }
_ => { panic!("Index out of bounds"); }
}
let mut new_tree = Octree::new(new_size.clone() as u8, new_pos);
new_tree.set(pos, val);
*self.children[index] = Some(new_tree); // Here it says I can't write to it
}
}
引用也被称为借用;它们的主要目的是临时,“借用”一个值被其他东西拥有。
定义数据结构时,它几乎不应该包含引用;相反,应该使用 owned 类型。有时这意味着写 T
而不是 &'a T
;在这种情况下,由于结构是递归的,它需要一个指针,但是一个拥有的而不是借用的——即 Box
.
更改您的结构定义
pub struct Octree<'a, T> {
children: [&'a Option<Octree<'a, T>>; 8],
data: Option<T>,
size: u8,
pos: VecI3
}
到
pub struct Octree<T> {
children: [Option<Box<Octree<T>>>; 8],
data: Option<T>,
size: u8,
pos: VecI3
}
请注意,该结构不再具有生命周期参数——就像 BTreeMap
(标准库中的递归结构)一样。
然后要插入子节点,您需要使用:
*self.children[index] = Some(Box::new(new_tree));