gpt4 book ai didi

rust - 共享弱特征对象引用

转载 作者:行者123 更新时间:2023-11-29 08:20:28 25 4
gpt4 key购买 nike

我正在尝试提供非拥有结构的“ View ”以分离系统的组件。

假设一组具有不同方法的特征:Drawable , Modifiable以及一些至少实现其中一个特征的结构 - SimpleBox , Panel , Expression .

系统的不同组件需要使用特定特征的方法频繁访问这些对象的序列;考虑一个 DrawingManagerModifyManager :

struct DrawingManager {
items: Vec<Weak<Drawable>>,
}

struct ModifyManager {
items: Vec<Weak<Modifiable>>
}

虽然在两个管理器中都可以引用单个对象,但假设所有结构都有一个单独的所有者:

struct ObjectManager {
boxes: Vec<Rc<Box>>,
panels: Vec<Rc<Panel>>,
expressions: Vec<Rc<Expression>>,
}

理想情况下,能够管理从一个地方删除结构会很有用——即将它从 ObjectManager 中删除足以使所有其他组件中的引用无效(因此使用 Weak )。

  • 有办法做到这一点吗?
  • 这是实现这一目标的正确方法吗?
  • 是否有更惯用的方式来实现此功能?

系统包含多个特征,因此使用所有其他特征的方法制作单个特征似乎是个坏主意。多个特征具有不止一种方法,因此无法用闭包替换它们。

我尝试过的

因为一个对象可能会产生一个或多个Rc<Trait> ,我们可能会设想用 HashMap<ID, Vec<Rc<Any>>> 来实现它由此我们使每个结构都有一个独特的 ID , 它映射到所有 Rc 的列表已经为它做了。

当我们要移除一个对象时,我们将其从相应的列表中移除,并移除hashmap中的条目,使所有Weak失效。引用资料。

然而,实现这个失败了,因为要插入 HashMap , 必须向上转换 Rc<Trait> -> Rc<Any> , 只会在稍后对其进行向下转换。

最佳答案

我不确定这是否是执行此操作的惯用方式,但我已经开发了一个提供此功能的 crate - dependent_view .

使用箱子,最初的问题可以通过使用 DependentRc 来解决而不是普通的 Rc的:

struct ObjectManager {
boxes: Vec<DependentRc<Box>>,
panels: Vec<DependentRc<Panel>>,
expressions: Vec<DependentRc<Expression>>
}

let object_manager : ObjectManager = ObjectManager::new();

然后使用crate提供的宏,我们可以得到Weak<>对这些结构的引用:

let box_view : Weak<Drawable> = to_view!(object_manager.boxes[0]);
let panel_view : Weak<Drawable> = to_view!(object_manager.panels[0]);
let expression_view : Weak<Drawable> = to_view!(object_manager.expressions[0]);

有了这个,删除相应的 DependentRc<>将使所有Weak<>无效对它的引用。

关于rust - 共享弱特征对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51621179/

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