我的项目以这种方式设置:
src/lib/rustic_io.rs
src/lib/server.rs
src/main.rs
main.rs
#[path="lib/rustic_io.rs"]
mod rustic_io;
fn main() {
// Setup information (Server is not started yet)
let mut server = rustic_io::listen("127.0.0.1", 1338);
// Event with data to listen for
server.on("connection", |data: &str| {
// Do stuff in here with data
});
// Start server
server.start();
}
rustic_io.rs
mod server;
/*
* Returns a new Server to start WebSocket Protocol
*/
pub fn listen(ip_addr: &str, port_num: u16) -> server::Server {
server::Server::new(String::from_str(ip_addr), port_num)
}
server.rs
pub struct Server<'srv> {
ip: String,
port: u16,
events: Vec<Event<'srv>>
}
impl &'a Server {
// Constructs a Server object
pub fn new<'a>(ip_addr: String, port_num: u16) -> Server<'a> {
Server {
ip: ip_addr,
port: port_num,
events: Vec::new()
}
}
pub fn on(&self, event: &str, execute: |data: &str|) {
// Do some stuff
}
pub fn start(&self) {
// Start up all the things
}
}
mod event {
pub struct Event<'a> {
name: String,
execute: |data: &str|:'a
}
}
一切正常,直到我想开始向Event
结构添加Server
类型的向量。为了将闭包添加为属性,它需要一生。在那里得到了一点SO的帮助。然后,为了在Vec<Event>
结构中拥有Server
,它也需要一生。一旦服务器结构完全耗尽,impl
现在需要生命周期。在实现部分开始生命之后,当我尝试编译时,我现在得到
error: failed to resolve. Not a module `Server`
指出这句话:server::Server::new(String::from_str(ip_addr), port_num)
我觉得在对函数内部的各种变量使用它们时,我对生命有一个很好的把握,但是在设计自己的结构和实现时,对于生命周期是什么感到无能为力。为什么服务器模块在实现使用生命周期时停止变得可解析?我觉得我正在以与我应该完全相反的方式解决这个问题,并且让终身指示器摆脱困境......
答案 0 :(得分:2)
这不是一生的问题。我能够使用以下代码编译代码:
impl &'a Server { ... }
是无效的语法。将其更改为impl<'a> Server<'a> { ... }
将Vec<Event<'srv>>
更改为Vec<event::Event<'srv>>
。
您还可以将impl块中的fn new<'a>
更改为fn new
。