gpt4 book ai didi

对象组合 : storing references vs. 引用的 ID

转载 作者:行者123 更新时间:2023-11-29 08:17:18 24 4
gpt4 key购买 nike

回到另一个关于 Rust 基本设计决策的菜鸟问题。

我正在编写一个简单的小游戏。我在以“id”为键的数据结构中有一个游戏对象池。我的问题是如何处理与池中对象相关的其他结构(比池中的结构生命周期更短)。

起初我做了以下事情:

struct Foo<'a> {
game_obj: &'a GameObject
// etc.
}

但是当我试图在与现存的 Foo 相同的范围内(可变地)引用 GameObject 时,我遇到了借用检查器的一系列问题。

所以现在我正在考虑这样的事情:

struct Foo {
game_obj_id: uint,
// etc.
}

这可能还有其他问题,但它确实解决了 Foo “独占”引用其相关 GameObject 的直接问题。

对此有哪些常用方法?

最佳答案

您可以存储 Rc<RefCell<GameObject>>在你的struct相反(除非 GameObject 是一个特征,在这种情况下,在实现动态大小类型 (DST) 之前这将不起作用)。

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

Rc<T> 是一种包含指向 T 的指针的类型和一个引用计数(实际上是两个:强引用计数和弱引用计数)。你可以.clone()一个Rc在不克隆底层对象的情况下增加引用计数。当 Rc被丢弃,引用计数减少。当引用计数降为零时,将删除引用对象并回收内存。注意 Rc已经动态分配内存;无需使用 Rc<Box<Thing>> 等结构(除非你知道自己在做什么)。

还有 Weak<T> , 可以用来代替 Rc对于不需要使对象保持事件状态的引用。

关于对象组合 : storing references vs. 引用的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25693374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com