将Vec <struct>传递给新任务</struct>

时间:2014-08-13 12:24:35

标签: task rust lifetime

我试图将Vector自定义结构传递给在新任务中执行的函数。我已经实现了Clone特征,我认为这是需要的,但显然我想传递的向量需要实现'static+Send才能在封闭中捕获。的环境。我不确定如何满足那些终身规格?

我试图从这个功能开始这个过程

pub fn start(server: Server, ip: &str, port: u16) {

    // Other things happening

    spawn(proc() {
        event_loop(server.events.clone(), from_conn_pool)
    });
}

fn event_loop(events: Vec<Event>, from_conn_pool: Receiver<Vec<Socket>>) {
    // Wizard magic
}

我收到的错误是:error: cannot capture variable of type rustic_io::server::Server<'_>, which does not fulfill 'static+Send, in a bounded closure

server.rs

rustic_io::server::Server<'_>

event.rs

'static+Send

事件循环任务将循环遍历各种流,如果读取的数据与某个事件名称匹配,则会触发与之关联的函数。从Rust文档中,我可以看到你可以通过调用spawn来启动一个命名函数:

pub struct Server<'a> {
    pub sockets: Vec<Socket<'a>>,
    pub events: Vec<Event<'a>>
}

我认为这是我应该产生任务的方式,因为它是一个被执行的命名函数。我假设因为我将其称为pub struct Event<'a> { pub name: String, pub execute: &'a fn(data: &str, server: super::Server) } impl<'a> Event<'a> { pub fn new(event: &str, execute: &'a fn(data: &str, server: super::Server)) -> Event<'a> { Event { name: String::from_str(event), execute: execute } } } impl<'a> Clone for Event<'a> { fn clone(&self) -> Event<'a> { Event { name: self.name.clone(), execute: self.execute } } } ,它期待所有进入的关闭 - 拥有?我尝试将任务生成为// Print something profound in a different task using a named function fn print_message() { println!("I am running in a different task!"); } spawn(print_message); ,但编译器给了我:spawn(proc(){ ... })

此时,我还不知道如何将spawn(event_loop(arg, arg2))纳入新任务?

1 个答案:

答案 0 :(得分:2)

proc()拥有其环境。任何进入它的内容都必须能够移入其中,因此必须'staticSend

这意味着当你写

spawn(proc() {
    event_loop(server.events.clone(), from_conn_pool)
});

它正在尝试捕获server(因为server.events.clone() - 请注意它是如何为此目的捕获整个Server的;它不太可能是你想要的(你可以做类似的事情)在发布之前let events = server.events.clone();,然后使用events,或者您只是承认clone()调用无论如何都是多余的)和from_conn_pool。问题出在server上:它不一定是'static,因为您没有为该类型指定任何生命周期,因此它被推断为任意生命周期;也就是说,它可能包含非静态生命周期的事件,显然可以'移动到新任务。首先你需要Server<'static>

但问题随之而来:为什么你使用&'a fn(…)而不只是fn(…)作为你的类型?如果你放弃整个参考物,你的问题就会消失。