我试图将处理程序传递给每个传入请求的线程,我尝试将其包装在 Arc 中,但出现以下错误:
参数类型
可能寿命不够长impl ConnectionHandler
如何解决这个问题?
impl TCPConnectionHandler {
pub async fn set_handler(&self, handler: impl ConnectionHandler) {
let arc_handler = Arc::new(handler);
loop {
let handler_clone = arc_handler.clone();
match self.0.accept().await {
Ok((mut stream, addr)) => {
let join_handle = tokio::task::spawn(async move {
handler_clone.on_incoming_connection(&addr);
// ^^^^^^^^^^^^^
// ❌ the parameter type `impl ConnectionHandler` may not live long enough
});
}
Err(_) => {
panic!("Error accepting connection")
}
}
}
}
}
仅仅因为您将值包装在
Arc
中并不意味着它仍然不能包含非静态引用。
例如,您可以有一个类型,
MyCoolConnectionHandler<'a>
,其中包含引用。类型 Arc<
MyCoolConnectionHandler<'a>>
仍然包含引用。
如果您的
ConnectionHandler
实现确实 not 包含引用,则需要告诉编译器它可以通过将其限制为 'static
生命周期来做出该假设:
pub async fn set_handler(&self, handler: impl ConnectionHandler + 'static) {
// ...
}
您可能会发现
Arc
现在变得不必要了。