【发布时间】:2023-03-20 09:25:01
【问题描述】:
我试图将自定义结构的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
}
}
}
事件循环任务只会遍历各种流,如果读取的数据与某个事件名称匹配,它会触发与其关联的函数。从 Rust 文档中,我可以看到您可以通过调用 spawn 来启动一个命名函数,如下所示:
// 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> 用于新任务?
【问题讨论】: