Object 对象组合:存储引用与引用ID

Object 对象组合:存储引用与引用ID,object,memory-management,rust,Object,Memory Management,Rust,回到关于Rust中基本设计决策的另一个noob问题 我在写一个简单的小游戏。我在数据结构中有一个游戏对象池,由它们的“id”键控。我的问题是如何处理与池中对象有关系的其他结构(比池中的结构寿命短) 首先,我做了以下工作: struct Foo<'a> { game_obj: &'a GameObject // etc. } 这可能还有其他问题,但它确实解决了Foo“垄断”引用其相关游戏对象的能力的直接问题 有哪些常用方法?您可以将Rc存储在struct中(除非Gam

回到关于Rust中基本设计决策的另一个noob问题

我在写一个简单的小游戏。我在数据结构中有一个游戏对象池,由它们的“id”键控。我的问题是如何处理与池中对象有关系的其他结构(比池中的结构寿命短)

首先,我做了以下工作:

struct Foo<'a> {
  game_obj: &'a GameObject
  // etc.
}
这可能还有其他问题,但它确实解决了
Foo
“垄断”引用其相关
游戏对象的能力的直接问题

有哪些常用方法?

您可以将
Rc
存储在
struct
中(除非
GameObject
是一种特性,在这种情况下,在实现动态大小类型(DST)之前,这将不起作用)

是一种类型,它包含一个
T
和一个标志,该标志指示该值是以可变方式借用、以不变方式借用还是未借用
RefCell
基本上在运行时而不是编译时移动借用检查;如果违反借用规则(如果可变借用或不可变借用,则无法进行可变借用;如果可变借用已被可变借用,则无法进行不可变借用),则任务将失败。请注意,可以同时存在多个不可变借用

是包含指向
T
的指针和引用计数(实际上有两个:强引用计数和弱引用计数)的类型。您可以使用
.clone()
an
Rc
增加引用计数,而无需克隆基础对象。当删除
Rc
时,参考计数递减。当引用计数下降到零时,引用对象被删除,内存被回收。注意,
Rc
已经动态分配内存;不需要使用诸如
Rc
之类的构造(除非您知道自己在做什么)


还有一个,它可以代替
Rc
用于不需要保持对象活动的引用。

这是否也需要更改游戏对象池?或者我可以将其保留为[GameObject,…COUNT]。
GameObject
存储在
RefCell
中,因此您必须创建一个
RefCell
数组。但是,您可以使用一个简单的借用指针来指向
RefCell
,而不是使用
Rc
。我花了几天的时间才理解这一点并使其工作,但我终于有了编译和运行的东西:)谢谢!我也对弱者很好奇。。。它似乎很难使用?我最终只使用了普通的Rc,因为它看起来像是为了实际使用弱Rc做任何事情,我不得不将它升级到一个普通的Rc…你会希望在长寿命的数据结构中使用
,如果不再需要引用的对象,就可以删除它。当您准备使用它时,必须将其升级到
Rc
,以确保在使用对象时不会丢弃该对象。但是,如果对象已被删除,
upgrade()
将返回
None
struct Foo {
  game_obj_id: uint,
  // etc.
}