我创建了一个类型Space
,它具有相同类型Space
的可选字段lef_neighbor
和right_neighbor
。Rust需要在编译时知道类型的大小,所以我将类型包装在Box<>
中。现在我想创建一个方法,我可以在Space
上调用该方法,该方法创建这个Space
对象的right_neighbor
并将其分配给它。它还需要将新Space
的left_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));
}
}
这会产生编译错误:
|
16 | neighbor_space.left_neighbor = Some(Box::new(self));
| ^^^^ expected struct `Space`, found `&mut Space`
如何解决此问题?
发布于 2021-10-11 11:41:02
首先,您正在制作的内容类似于一个双向链表。众所周知,双向链表很难在安全的环境中实现。我推荐给Learning Rust with Entirely Too Many Linked Lists读一读。
作为一个TLDR,你可以使用原始指针和unsafe,或者将你的空间存储在外部存储器(一个向量,或者其他东西)中,并使用索引到该空间作为实际对象的代理,或者使用Rc/Arc而不是Box (尽管这可能会导致内存泄漏,除非你正确地使用弱ref等)。
https://stackoverflow.com/questions/69525434
复制相似问题