rust 如何在更改数据时保持不可变的借用?[duplicate]

9fkzdhlc  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(139)

此问题在此处已有答案

Why can't I store a value and a reference to that value in the same struct?(4个答案)
2天前关闭。
我正在尝试为我的抽象节点系统写一个渲染器。
每个节点都在一个韦濬上,韦濬如下所示:

struct Circuit<'a> {
  nodes: Vec<Node>,
  connections: Vec<Connection<'a>>,
}

其中每个节点都包含一些任意数据,并且有一个连接将这两个节点连接起来。

struct Connection<'a> {
  from: &'a Node,
  to: &'a Node,
}

在一个示例中,我试图可变地迭代Circuit.nodes并更改一些数据,同时仍然将对Node的引用保留在Connections中。我希望Connection引用仍然保留对相同Node结构体的引用,但指向可变借位后更新的数据。
但是使用这种设置,我得到了一个cannot borrow 'circuit.nodes' as mutable because it is also borrowed as immutable错误。
我试过使用RefCell和一个Mutex,但是没有成功。我找不到很好的资源来解释这个问题。

gfttwv5a

gfttwv5a1#

也许您希望将节点 Package 在Rc中(如果在多线程环境中,则为Arc),这样连接和电路就可以共享节点的所有权

use std::rc::Rc;
use std::cell::RefCell;
fn main() {
    let a = Rc::new(RefCell::new(Node { data: "a".into() }));
    let b = Rc::new(RefCell::new(Node { data: "b".into() }));
    let conn = Connection {
        from: a.clone(),
        to: b.clone(),
    };
    let cir = Circuit {
        nodes: vec![a.clone(), b.clone()],
        connections: vec![conn],
    };
}

# [derive(Debug)]

struct Node {
    data: String,
}

# [derive(Debug)]

struct Circuit {
  nodes: Vec<Rc<RefCell<Node>>>,
  connections: Vec<Connection>,
}

# [derive(Debug)]

struct Connection {
  from: Rc<RefCell<Node>>,
  to: Rc<RefCell<Node>>,
}

相关问题