我试图将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))
纳入新任务?
答案 0 :(得分:2)
proc()
拥有其环境。任何进入它的内容都必须能够移入其中,因此必须'static
和Send
。
这意味着当你写
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(…)
作为你的类型?如果你放弃整个参考物,你的问题就会消失。