通过A VEC 进入一个新的任务(Passing a Vec into a n

2019-10-20 16:45发布

林试图将通过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

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

event.rs

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))但编译器给我: error: mismatched types: expected proc():Send but found () (expected fn but found ())

在这一点上,我有不知道如何获取Vec<Event>到一个新的任务?

Answer 1:

一个proc()拥有自己的环境。 任何进入它必须能够被移动到它,因此必须是'staticSend

这意味着,当你写

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

它试图捕捉server (因为server.events.clone() -注意它是如何捕捉整个Server用于此目的,它不可能是你想要的(你可以做这样的事情是什么let events = server.events.clone(); proc前面,然后使用events ,或者你可以承认clone()调用是多余反正)和from_conn_pool 。你的问题是与server :它不一定是'static ,因为你没有指定任何一辈子类型,所以它被推断为任意的寿命;也就是说,它可能包含非静态的一生,这显然不能被移动到一个新的任务的情况下你会对于初学者的需要。 Server<'static>

但问题随之上升:为什么您使用&'a fn(…)而不是仅仅fn(…)为你喜欢的类型? 如果你把整个事情参考那里,你的问题就会迎刃而解。



文章来源: Passing a Vec into a new task