我正在创建一个多线程应用程序,在其中创建接收 channel 和用于保存发送 channel 的结构(稍后将在实现中使用)。但是,我通过 channel 发送的类型具有生存期规范。此类型为websocket::message:Message
来自rusts-weboscket库。由于存在此规范, rust 似乎无法正确推断出通过线程传递的生命周期。
这是此错误的一个 rust 操场示例:
https://play.rust-lang.org/?gist=7e37547d1c811185654f10a6a461e1ef&version=stable&backtrace=1
现在,我尝试使用横梁来确定生命周期的范围,这似乎解决了眼前的问题,但是实际上只是将生命周期规范问题委托(delegate)给了其他地方。
在我的代码中,我得到了错误:
$ cargo check
Compiling rump v0.1.0 (file:///home/alainh/UPenn/CIS198/Rump)
transport.rs:200:42: 200:57 error: cannot infer an appropriate lifetime for autoref due to conflicting requirements [E0495]
transport.rs:200 self.sender.send(self.serializer.encode(message));
^~~~~~~~~~~~~~~
transport.rs:199:5: 202:6 help: consider using an explicit lifetime parameter as shown: fn send<T: Encodable>(&'a mut self, message: &T) -> WampResult<()>
transport.rs:199 fn send<T: Encodable>(&mut self, message: &T) -> WampResult<()> {
transport.rs:200 self.sender.send(self.serializer.encode(message));
transport.rs:201 Ok(())
transport.rs:202 }
error: aborting due to previous error
Could not compile `rump`.
有问题的行是这一行:
https://github.com/aehernandez/Rump/blob/ad717c7ef11857e94d0e1c02539667c8034676c4/src/transport.rs#L199
在这一点上,我不确定如何确切地解决这个生命周期问题。我不想继续委派其他地方。有一个好的解决方案吗?
最佳答案
当您生成线程时,它可能永远存在。对于Transport<'a>
以外的任何生存期'a
,肯定会超过'static
类型(尽管错误消息非常令人困惑)。当您使用闭包调用thread::spawn
时,该闭包必须具有'static
生存期,仅当'a == 'static
时才为真。
由于您实际上并未在整个 channel 上发送具有生存期的对象,因此请考虑显式使用'static
生存期:
impl Connector for Transport<'static> {
...
}
Playpen
编辑:
手动注释发送者和接收者的类型
let (tx, rx): (mpsc::Sender<Message<'a>>, mpsc::Receiver<Message<'a>>) = mpsc::channel();
let tx_send: mpsc::Sender<Message<'a>> = tx.clone();
告诉你一个更明智的错误
<anon>:27:22: 27:35 error: the type `[closure@<anon>:27:36: 29:10 tx_send:std::sync::mpsc::Sender<Message<'a>>]` does not fulfill the required lifetime [E0477]
<anon>:27 let handle = thread::spawn(move || {
^~~~~~~~~~~~~
note: type must outlive the static lifetime
error: aborting due to previous error
playpen: application terminated with error code 101
Playpen