在一个模块中使用 Rc<T>s,在另一个模块中使用 Rc<RefCell<T>>s 引用相同的数据
Having Rc<T>s in one module and Rc<RefCell<T>>s in another referencing the same data
我有这样的数据结构:
mod nodes {
struct Node {
predecessors: Vec<Rc<Node>>
}
}
我显然不需要该模块中节点的可变性。我这里也没有循环引用。
但是我有另一个模块,其中包含我需要可变性的节点:
pub mod network {
mod nodes {...}
struct Network {
nodes: Vec<Vec<Rc<RefCell<Node>>>>
}
}
我只是想不出一种方法来为节点本身创建 Rc<Node>
s 以及为 Network
.
创建 Rc<RefCell<Node>>
s
您是否知道如何在 network
模块中的可变节点旁边实现 nodes
模块中的不变性?
或者除了将 Node
结构中对前任节点的引用声明为 Rc<RefCell<Node>>
之外别无他法,即使我在这里不需要可变性(我想避免那个)?
Rust 有 single ownership。如果一个 Node
被一个 RefCell
拥有,它不能同时被另一个 Rc
拥有。
当 Node
可以通过 RefCell
在一个地方修改时,这些更改不能显示在 Rc<Node>
的其他地方。这将违反 Rc<Node>
.
的不变性
另请注意,Node
是一个结构值,而不是指向对象的指针。没有额外的间接层甚至可以在 RefCell
和其他 Rc
之间共享它。它的数据被复制并内联到它的容器中。
考虑在这两个地方使用 Rc<RefCell<Node>>
。如果在两个地方使用相同的数据,它必须在两个地方都支持所有保证,即使你没有利用它。
如果您没有同时使用这两种类型,您可以通过解构它 (into_inner
, try_unwrap
) 并再次构造另一种类型来从一种类型转换为另一种类型。这种转换不是免费的,因为这些类型的物理内存布局不同。
如果你只是有时需要可变性,Rc
有 make_mut
that works without RefCell
. And RefCell
has a zero-cost get_mut
如果你已经有一个可变的访问它,所以你可以在特定情况下减少他们的开销.
我有这样的数据结构:
mod nodes {
struct Node {
predecessors: Vec<Rc<Node>>
}
}
我显然不需要该模块中节点的可变性。我这里也没有循环引用。
但是我有另一个模块,其中包含我需要可变性的节点:
pub mod network {
mod nodes {...}
struct Network {
nodes: Vec<Vec<Rc<RefCell<Node>>>>
}
}
我只是想不出一种方法来为节点本身创建 Rc<Node>
s 以及为 Network
.
Rc<RefCell<Node>>
s
您是否知道如何在 network
模块中的可变节点旁边实现 nodes
模块中的不变性?
或者除了将 Node
结构中对前任节点的引用声明为 Rc<RefCell<Node>>
之外别无他法,即使我在这里不需要可变性(我想避免那个)?
Rust 有 single ownership。如果一个 Node
被一个 RefCell
拥有,它不能同时被另一个 Rc
拥有。
当 Node
可以通过 RefCell
在一个地方修改时,这些更改不能显示在 Rc<Node>
的其他地方。这将违反 Rc<Node>
.
另请注意,Node
是一个结构值,而不是指向对象的指针。没有额外的间接层甚至可以在 RefCell
和其他 Rc
之间共享它。它的数据被复制并内联到它的容器中。
考虑在这两个地方使用
Rc<RefCell<Node>>
。如果在两个地方使用相同的数据,它必须在两个地方都支持所有保证,即使你没有利用它。如果您没有同时使用这两种类型,您可以通过解构它 (
into_inner
,try_unwrap
) 并再次构造另一种类型来从一种类型转换为另一种类型。这种转换不是免费的,因为这些类型的物理内存布局不同。如果你只是有时需要可变性,
Rc
有make_mut
that works withoutRefCell
. AndRefCell
has a zero-costget_mut
如果你已经有一个可变的访问它,所以你可以在特定情况下减少他们的开销.