Rust - 实现多个结构体共享上下文的正确方式

3
我目前正在使用Rust实现我的第一个库,和许多其他从Java等语言转换过来的开发人员一样,我在寻找Rust中常见模式/用例的正确解决方案方面遇到了困难。
我的Rust库有多个结构体。其中许多需要访问一些对它们的功能至关重要的共同配置选项。例如:
pub struct A {
    pub context: Context
}

pub struct B {
    pub context: Context
}

pub struct Context {
    pub dbUri: String
}

当结构体初始化时,上下文将被传递给每个结构体一次。上下文属性值可能会在运行时更改,这应该使这些更改对任何依赖的结构体可用。如果需要,结构体应该能够更改上下文。将来可能需要将上下文提供给不同的线程。
到目前为止,我找到的最好的解决方案是使用Mutex包装在Arc中,如此处所述。
我想知道这是否是实现我的要求的正确方法,还有其他可用选项?

Arc<Mutex<Context>>似乎可以解决你的问题,所以我不太清楚你在寻找什么。 - Sven Marnach
根据您的内存限制,克隆上下文(或仅克隆组件所需的子结构)可能已足够(如果它在您的示例中是不可变的)。 - leetwinski
如果您不需要从多个线程访问,也可以使用Rc<RefCell>。如果您关心性能(或者不需要毒化功能),请考虑使用parking_lot中的Mutex。 - user4815162342
1个回答

0
你想问的是如何在Rust中“隐藏客户端的依赖”。不幸的是,在Rust中,每种方法都显得笨拙。
1. 使用`Rc>`及其相关类型。重复类型定义非常繁琐。而且,`Rc`会传染。一个地方使用了`Rc`,其他所有使用该服务的地方也必须使用`Rc`。
2. 使用引用和一堆生命周期参数。在Rust中,生命周期也会传染。如果客户端想将服务作为字段持有,那么每个客户端都必须标记自己的生命周期。
3. 放弃在字段中持有依赖项。将上下文作为参数传递。这样做会导致实现细节泄漏到客户端代码中。这种方式会使客户端代码与服务代码更加耦合。此外,你的代码本质上将变成过程式代码。
无论如何,这是你的选择。过程式编程并不可怕。

Rc 不具有传染性(尽管 RefCell 在某种程度上具有)。 - Chayim Friedman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接