提问人:user19831231 提问时间:4/3/2023 最后编辑:cafce25user19831231 更新时间:4/3/2023 访问量:74
Rust 中 Counted Immutable Refefence 背后的数据
Data behind Counted Immutable Refefence in Rust
问:
我在 Rust 中有一个数据结构,它被创建然后永远不会改变(就像游戏的规则集一样)。然后我想在其他结构中引用该数据,但我不希望这些其他结构拥有它,只需“不可变”地引用它。 如果当没有更多引用时删除数据,那就太好了。 所以 Rc 浮现在脑海中。但是,对于借用检查器,它似乎拥有该数据。 然后是 RefCell,它确实可以解决问题。但它也允许可变地借用内部数据,这是我想防止的,它允许可变性。
让我这些成为我的定义:
struct RuleSet { rule1: Rule; ... }
struct GameState{ ruleSet: ??<RuleSet>; ... }
Impl for GameState {
fn do_things(&mut self, rule: &rule){ ... }
}
我想做这样的事情:
let state: GameState = ...;
let def = state.ruleSet.rule1;
state.do_things(def); // <- here it complains: cannot mutably borrow 'state' whlie immutably borrow 'state' (def is part of it)
如果我只是让 be of type ,它会抱怨它不能借用,因为它是借来的(从上面的那一行),因为它是其中的一部分是它的一部分。
当我使用它时,它说了同样的话,所以不知何故它认为它对其内容拥有所有权。我可以在把东西拿出来之前克隆它,但这很丑陋。
当我使用时,我可以像这样访问它: 这非常接近我想要实现的目标,但支持,我不想要,我认为它不做参考计数。ruleSet
RuleSet
state
def
rule1
ruleSet
Rc
Rc
RefCell
state.ruleSet.borrow().rule1
RefCell
borrow_mut()
所以我主要想让它不可变或断开连接,这样借用检查器就不会认为我不能在有引用时弄乱父结构。
答:
你完全想要一个(或在并发上下文中)不知道为什么你认为克隆它是“丑陋的”,但你必须通过一些操作来增加计数器,而 a 正是这样做的。它完全是为您的用例而设计的,当没有任何东西再使用它时,它就会被清理掉,因此每个共享所有者都可以保留终生绑定的东西,但 .Rc
Arc
clone
'static
共享引用的唯一其他选项是它,但这不能满足您在不再使用数据时释放数据的要求。Box::leak
评论
Rc
Rc::clone (&state.ruleSet.rule1)
Rc
评论