生命周期添加到struct / impl使模块无法解析

时间:2014-08-07 18:21:23

标签: struct rust lifetime

我的项目以这种方式设置:

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)

我觉得在对函数内部的各种变量使用它们时,我对生命有一个很好的把握,但是在设计自己的结构和实现时,对于生命周期是什么感到无能为力。为什么服务器模块在实现使用生命周期时停止变得可解析?我觉得我正在以与我应该完全相反的方式解决这个问题,并且让终身指示器摆脱困境......

1 个答案:

答案 0 :(得分:2)

这不是一生的问题。我能够使用以下代码编译代码:

  1. impl &'a Server { ... }是无效的语法。将其更改为impl<'a> Server<'a> { ... }

  2. Vec<Event<'srv>>更改为Vec<event::Event<'srv>>

  3. 您还可以将impl块中的fn new<'a>更改为fn new