借用并赋值给 &reference 后面的值

Borrow and assign to values behind & reference

所以我试图在 Rust 中制作我自己的八叉树,但我在使用 set 函数时遇到了问题。它应该是递归的,并且有一点我正在匹配子节点。除了,它有两个错误:

  1. 它不能借用一个子元素作为可变的,因为它在 & 引用后面。
  2. 我不知道如何创建一个新的子项(如果它确实存在)。由于我的 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
            }
        }

Link to octree.rs Gist

引用也被称为借用;它们的主要目的是临时,“借用”一个值被其他东西拥有

定义数据结构时,它几乎不应该包含引用;相反,应该使用 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));