Rust 中 Counted Immutable Refefence 背后的数据

Data behind Counted Immutable Refefence in Rust

提问人:user19831231 提问时间:4/3/2023 最后编辑:cafce25user19831231 更新时间:4/3/2023 访问量:74

问:

我在 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 ,它会抱怨它不能借用,因为它是借来的(从上面的那一行),因为它是其中的一部分是它的一部分。 当我使用它时,它说了同样的话,所以不知何故它认为它对其内容拥有所有权。我可以在把东西拿出来之前克隆它,但这很丑陋。 当我使用时,我可以像这样访问它: 这非常接近我想要实现的目标,但支持,我不想要,我认为它不做参考计数。ruleSetRuleSetstatedefrule1ruleSetRcRcRefCellstate.ruleSet.borrow().rule1RefCellborrow_mut()

所以我主要想让它不可变或断开连接,这样借用检查器就不会认为我不能在有引用时弄乱父结构。

Rust 引用 不变性 borrow-checker refcell

评论


答:

4赞 cafce25 4/3/2023 #1

你完全想要一个(或在并发上下文中)不知道为什么你认为克隆它是“丑陋的”,但你必须通过一些操作来增加计数器,而 a 正是这样做的。它完全是为您的用例而设计的,当没有任何东西再使用它时,它就会被清理掉,因此每个共享所有者都可以保留终生绑定的东西,但 .RcArcclone'static

共享引用的唯一其他选项是它,但这不能满足您在不再使用数据时释放数据的要求。Box::leak

评论

1赞 Jmb 4/3/2023
@user19831231只是为了更清楚地说明:当您克隆 WITH 时,您不是在克隆内部数据,而只是在创建一个指向相同数据的新数据并增加引用计数。RcRc::clone (&state.ruleSet.rule1)Rc