我编写了一个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
拥有一个server
对象来与http服务器通信。因此端点对象可以通过self.master.server.communicate()
调用此服务器对象。
但是我把我的铁锈车开到了recursive type 'Master' has infinite size
。在那之后,我尝试了m: &'a Master
所有生命定义。但没有成功。
我现在有两个问题:
编辑:
答案 0 :(得分:1)
由于编译器告诉你Todo
和Master
是递归类型,因此具有无限大小,你需要
在某个时刻插入间接(例如,
Box
,Rc
或&
)
所以你基本上有三个选择:
Master
Todo
作为参考
醇>
这会为您的结构引入生命周期,但应该是可能的:
struct Server {}
struct Todo<'a> {
m: &'a Master<'a>
}
struct Master<'a> {
todo: Todo<'a>,
server: Server,
}
box
master
看起来更简单,您不会从一开始就遇到生命周期问题。但请注意,box
生命周期为'static
。您可能需要更改它。
struct Server {}
struct Todo{
m: Box<Master> // or if 'static is not what you need Box<Master + 'a>
}
struct Master {
todo: Todo,
server: Server,
}
Master
引用计数引入了一个小的运行时开销。但是当你处理那些应该可以忽略不计的http请求时。
use std::rc::Rc;
struct Server {}
struct Todo{
m: Rc<Master>
}
struct Master {
todo: Todo,
server: Server,
}
这是您的三个基本选项。我建议你和他们一起玩,以了解他们。