Architecture 代理对象的设计原则或不同的方法 主要问题:

Architecture 代理对象的设计原则或不同的方法 主要问题:,architecture,rust,Architecture,Rust,我编写了一个cli应用程序来与http服务器通信。服务器为我提供了几个端点和这些端点下的一些函数(例如,/todo/add,/other_endpoint/del)。对库的访问应该表示这些端点(例如master.todo.add(…),master.other_endpoint.del(…)) 我的第一个尝试是添加Master作为对所有端点对象的引用 struct Todo { m: Master } Master将对象保存到所有端点 struct Master { todo:

我编写了一个cli应用程序来与http服务器通信。服务器为我提供了几个端点和这些端点下的一些函数(例如,
/todo/add
/other_endpoint/del
)。对库的访问应该表示这些端点(例如
master.todo.add(…)
master.other_endpoint.del(…)

我的第一个尝试是添加
Master
作为对所有端点对象的引用

struct Todo {
    m: Master
}
Master
将对象保存到所有端点

struct Master {
    todo: Todo,
    other_endpoint: OtherEndpoint,
    server: Server,
}
Master
保存一个
服务器
对象以与http服务器通信。因此端点对象可以通过
self.master.server.communicate()
调用此服务器对象

但是我驾驶着我那辆生锈的(y)车,撞上了一辆无限大的递归类型“Master”。在此之后,我尝试了一个
m:&'a Master
,其中包含了所有的生命周期定义。但是没有成功

我现在有两个问题:

  • 我要怎么做才能让它工作
  • 是否存在另一种设计(可能更好)来完成此任务
  • 编辑:

    • 当我询问关于这个问题的设计时,这个问题没有得到解决

    正如编译器告诉您的那样,
    Todo
    Master
    是递归类型,因此大小无限,您需要

    在某个点插入间接寻址(例如,
    Rc
    ,或
    &

    所以你基本上有三个选择:

  • 按住
    Master
    作为
    Todo
  • 这将为结构引入生命周期,但应该是可能的:

    struct Server {}
    
    struct Todo<'a> {
        m: &'a Master<'a>
    }
    
    struct Master<'a> {
        todo: Todo<'a>,
        server: Server,
    }
    
  • 编译器提供给您的最后一个选项是指向
    Master
  • 引用计数引入了较小的运行时开销。但是,当您处理http请求时,这应该可以忽略不计

    use std::rc::Rc;
    struct Server {}
    
    struct Todo{
        m: Rc<Master>
    }
    
    struct Master {
        todo: Todo,
        server: Server,
    }
    
    使用std::rc::rc;
    结构服务器{}
    结构待办事项{
    m:Rc
    }
    结构主控{
    todo:todo,
    服务器:服务器,
    }
    

    这是你的三个基本选择。我建议你和他们一起玩,了解他们。

    。谢谢你的帮助。我还有一些其他问题,但我所描述的问题得到了回答。谢谢@Jdemler。
    use std::rc::Rc;
    struct Server {}
    
    struct Todo{
        m: Rc<Master>
    }
    
    struct Master {
        todo: Todo,
        server: Server,
    }