- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编译以下代码 ( 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? : 关于尝试在没有 Boxes 的情况下解决这个问题。答案表明我现在必须使用 Box>。
请注意,我根据问题 2 中的建议使用辅助函数 constrain_handler
;它使我能够克服不同的编译错误。
最佳答案
看来您错过了之前问题及其重复问题的关键要点:
通过在闭包参数上声明类型,您停止对参数执行类型推断。这会导致闭包生成一个新的隐式生命周期,该生命周期不符合您的要求。只是根本不声明类型。
接下来,您需要声明您的闭包将引用一些字节并返回一个装箱特征对象,该对象将返回相同生命周期的一些字节并包含相同生命周期的引用:
struct FragMsgReceiver<'a> {
recv_dgram: &'a for<'b> FnMut(&'b mut [u8])
-> Box<MockFutureTrait<Item = &'b mut [u8]> + 'b>,
}
参见 Why is Box<Iterator<Item = &Foo> + 'a> needed?有关 + 'a
语法的更多详细信息。
然后更新 constrain_handler
以匹配:
struct FragMsgReceiver<'a> {
recv_dgram: &'a for<'b> FnMut(&'b mut [u8])
-> Box<MockFutureTrait<Item = &'b mut [u8]> + 'b>,
}
fn constrain_handler<F>(f: F) -> F
where
F: for<'b> FnMut(&'b mut [u8])
-> Box<MockFutureTrait<Item = &'b mut [u8]> + 'b>,
{
f
}
fn main() {
let mut recv_dgram = constrain_handler(|buf| Box::new(MockFuture { item: buf }));
let fmr = FragMsgReceiver {
recv_dgram: &mut recv_dgram,
};
}
如果直接采用通用闭包,整个事情可以变得更简单:
struct FragMsgReceiver<R>
where
R: for<'b> FnMut(&'b mut [u8])
-> Box<MockFutureTrait<Item = &'b mut [u8]> + 'b>,
{
recv_dgram: R,
}
fn main() {
let fmr = FragMsgReceiver {
recv_dgram: |buf| Box::new(MockFuture { item: buf }),
};
}
关于rust - 无法推断返回包含引用的盒装特征的闭包的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46253306/
我正在努力寻找任何教程来帮助我将 SurfaceView 放入盒子中。一个指向正确方向的指针会很棒——而不是通过它寻找一只手。 我希望能够在屏幕顶部分配一个区域,例如做按钮等,然后让表面 View 填
我需要一个返回所提供类类型实例的方法。让我们假设提供的类型被限制为可以创建它们的“空”实例。例如,提供 String.class 将返回一个空字符串,提供一个 Integer.class 将返回一个初
小问题:是否保证此代码始终打印 true? Boolean b1 = true; Boolean b2 = true; System.out.println(b1 == b2); boolean 值的
我昨晚在开发一个应用程序时遇到了一个特定的问题,我确信它可能有一个有效的算法来解决它。谁能推荐一下? 问题: TL;DR:也许图片会有所帮助:http://www.custom-foam-insert
我正在使用 ggplot2 开发一个图形,其中我需要将文本叠加在其他图形元素上。根据文本下方元素的颜色,文本可能难以阅读。有没有办法在半透明背景的边界框中绘制geom_text? 我可以用plotri
使用 rustc 1.10.0,我正在尝试编写一些绕过盒装闭包的代码——最终目标是按程序生成分形动画。现在我有一些像这样的函数签名: pub fn interpolate_rectilinear(wi
这个问题在这里已经有了答案: The trait bound `futures::Future, Error=Box>: Send` is not satisfied (1 个回答) Sending
我是一名优秀的程序员,十分优秀!