我在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
中,因为rule1
是ruleSet
的一部分,ruleSet
是它的一部分。当我使用Rc
时,它说的是同样的事情,所以不知何故,它认为它拥有其内容的所有权。我可以在取出东西之前克隆Rc
,但这很难看。当我使用RefCell
时,我可以像这样访问它:state.ruleSet.borrow().rule1
这非常接近我想要实现的目标,但是RefCell
支持borrow_mut()
,这是我不想要的,而且我认为它不支持引用计数。
所以我主要是想让它不可变或分离,这样借用检查器就不会认为我不能在引用父结构的同时弄乱它。
1条答案
按热度按时间1bqhqjot1#
你要的是一个
Rc
(或并发上下文中的Arc
)不知道为什么你认为克隆它是“丑陋的”,但你必须通过一些操作来增加计数器,而clone
正是这样做的。当没有任何东西再使用它时,它会被清理,这样每个共享所有者就可以保留某个东西,其生命周期只绑定到'static
。共享引用的唯一其他选项是
Box::leak
it,但这并不能满足不再使用数据时释放数据的要求。