【发布时间】:2017-09-16 11:18:12
【问题描述】:
我正在尝试编译以下代码 (playground):
trait MockFutureTrait {
type Item;
}
struct MockFuture<T> {
item: T,
}
impl<T> MockFutureTrait for MockFuture<T> {
type Item = T;
}
struct FragMsgReceiver<'a, 'c: 'a> {
recv_dgram: &'a FnMut(&mut [u8])
-> Box<MockFutureTrait<Item = &mut [u8]> + 'c>,
}
fn constrain_handler<F>(f: F) -> F
where
F: FnMut(&mut [u8]) -> Box<MockFutureTrait<Item = &mut [u8]>>,
{
f
}
fn main() {
let mut recv_dgram = constrain_handler(|buf: &mut [u8]| {
Box::new(MockFuture { item: buf }) as Box<MockFutureTrait<Item = &mut [u8]>>
});
let ref_recv_dgram = &mut recv_dgram;
let fmr = FragMsgReceiver {
recv_dgram: ref_recv_dgram,
};
}
我得到了编译错误:
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
--> src/main.rs:28:37
|
28 | Box::new(MockFuture { item: buf }) as Box<MockFutureTrait<Item = &mut [u8]>>
| ^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime #2 defined on the body at 27:44...
--> src/main.rs:27:44
|
27 | let mut recv_dgram = constrain_handler(|buf: &mut [u8]| {
| ____________________________________________^
28 | | Box::new(MockFuture { item: buf }) as Box<MockFutureTrait<Item = &mut [u8]>>
29 | | });
| |_____^
note: ...so that expression is assignable (expected &mut [u8], found &mut [u8])
--> src/main.rs:28:37
|
28 | Box::new(MockFuture { item: buf }) as Box<MockFutureTrait<Item = &mut [u8]>>
| ^^^
= note: but, the lifetime must be valid for the static lifetime...
note: ...so that expression is assignable (expected std::boxed::Box<MockFutureTrait<Item=&mut [u8]> + 'static>, found std::boxed::Box<MockFutureTrait<Item=&mut [u8]>>)
--> src/main.rs:28:9
|
28 | Box::new(MockFuture { item: buf }) as Box<MockFutureTrait<Item = &mut [u8]>>
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我尝试添加各种生命周期提示,但无法编译此代码。
我之前关于 SO 的相关问题:
Cannot infer a lifetime for a struct containing a reference to a closure:当返回值是一个简单的结构而不是一个特征时,解决同样的问题。
How can multiple struct fields be generics that use the same higher-kinded lifetime?:关于尝试在没有 Box 的情况下解决此问题。答案表明,现在我将不得不使用 Box>。
请注意,根据我在问题 2 中得到的建议,我正在使用辅助函数 constrain_handler;它允许我克服不同的编译错误。
【问题讨论】:
-
我从来没有看到过my comment on your original question 的回答,说明你为什么希望它成为对闭包的引用。
-
@shepmaster:还有其他方法吗?我想要做的是采用基于数据报的套接字,并将其包装在一种新类型中,该类型将允许我发送和接收抽象数据报(这些数据报与底层数据报之间没有 1-1 对应关系)。因此,我参考了
recv_dgram函数。