Rust中计数不可变引用背后的数据

hwamh0ep  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(100)

我在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)

如果我只是让ruleSet的类型为RuleSet,它会抱怨不能借用state,因为它是借用的(从上面的一行)在def中,因为rule1ruleSet的一部分,ruleSet是它的一部分。当我使用Rc时,它说的是同样的事情,所以不知何故,它认为它拥有其内容的所有权。我可以在取出东西之前克隆Rc,但这很难看。当我使用RefCell时,我可以像这样访问它:state.ruleSet.borrow().rule1这非常接近我想要实现的目标,但是RefCell支持borrow_mut(),这是我不想要的,而且我认为它不支持引用计数。
所以我主要是想让它不可变或分离,这样借用检查器就不会认为我不能在引用父结构的同时弄乱它。

1bqhqjot

1bqhqjot1#

你要的是一个Rc(或并发上下文中的Arc)不知道为什么你认为克隆它是“丑陋的”,但你必须通过一些操作来增加计数器,而clone正是这样做的。当没有任何东西再使用它时,它会被清理,这样每个共享所有者就可以保留某个东西,其生命周期只绑定到'static
共享引用的唯一其他选项是Box::leak it,但这并不能满足不再使用数据时释放数据的要求。

相关问题