【问题标题】:Expected struct but found mutable reference to struct预期结构,但发现对结构的可变引用
【发布时间】:2021-10-11 11:25:30
【问题描述】:

我创建了一个类型Space,它有一个可选字段lef_neighborright_neighbor 的类型相同Space。 Rust 需要在编译时知道类型的大小,所以我将类型包装在 Box<> 中。我现在想创建一个可以调用Space 的方法,该方法创建此Space 对象的right_neighbor 并按原样分配它。还需要将新的Spaceleft_neighbor字段设置为旧的Space,这样才能找到对方。

pub struct Space {
    left_neighbor: Option<Box<Space>>,
    right_neighbor: Option<Box<Space>>,
}

impl Space {
    pub fn new() -> Self {
        Self {
            left_neighbor: None,
            right_neighbor: None,
        }
    }

    pub fn create_neigbor(&mut self) {
        let neighbor_space = Space::new();
        neighbor_space.left_neighbor = Some(Box::new(self));
        self.right_neighbor = Some(Box::new(neighbor_space));
    }
}

(Playground link)

这给出了编译错误:

   |
16 |         neighbor_space.left_neighbor = Some(Box::new(self));
   |                                                      ^^^^ expected struct `Space`, found `&mut Space`

我该如何解决这个问题?

【问题讨论】:

  • Box&lt;Space&gt; 是一个智能指针,它指向堆分配的Space拥有它(即在Box 被删除时删除它)。您正在尝试使用对Space 的引用来创建Box&lt;Space&gt;,这是另一回事。 Rust 没有 GC,所以对象和对对象的引用是非常不同的东西,因为前者是拥有的,而后者只是借来的。

标签: rust


【解决方案1】:

首先,您所做的类似于双向链表。众所周知,双向链表在安全生锈中很难做到。我建议阅读Learning Rust with Entirely Too Many Linked Lists

作为 TLDR,您可以使用原始指针和不安全指针,或者将空间存储在外部存储(向量或其他东西)中,并使用该空间的索引作为实际事物的代理,或者使用 Rc/Arc而不是 Box(尽管这可能会导致内存泄漏,除非您正确使用弱引用等)。

【讨论】:

    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 2023-03-20
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    相关资源
    最近更新 更多