- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想存储一个回调,它可以采用不同类型的参数(拥有的值和引用),并且还可以修改其环境(因此是 FnMut)。当使用引用调用回调时,我希望编译器强制该参数仅在闭包主体中有效。我尝试使用盒装闭包来实现这一点。
如下所示的最小示例:
fn main() {
let mut caller = Caller::new();
let callback = |x: &Foo| println!("{:?}", x);
caller.register(callback);
let foo = Foo{
bar: 1,
baz: 2,
};
//callback(&foo); // works
caller.invoke(&foo); // borrowed value does not live long enough
}
struct Caller<'a, T> {
callback: Box<dyn FnMut(T) + 'a>
}
impl<'a, T> Caller<'a, T> {
fn new() -> Self {
Caller {
callback: Box::new(|_| ()),
}
}
fn register(&mut self, cb: impl FnMut(T) + 'a) {
self.callback = Box::new(cb);
}
fn invoke(&mut self, x: T) {
(self.callback)(x);
}
}
#[derive(Debug, Clone)]
struct Foo {
bar: i32,
baz: i32,
}
我想了解为什么如果我直接调用 callback()
会起作用,但如果我通过一个不拥有闭包的结构调用它,编译器会提示生命周期。也许它与Box
有关?如果我在 caller
之前定义 foo
,我就可以让它工作,但我想避免这种情况。
最佳答案
这是编译器在处理类似类型的闭包和边界时的类型推断怪癖的另一个示例 ( issue #41078 )。虽然这个Caller<'a, T>
似乎能够很好地处理invoke
需要给定的通用 T
,给定的示例传递引用 &'b Foo
(其中 'b
是该值的某个匿名生命周期)。由于此限制,T
被推断为 &Foo
一个预期生命周期的一个预期生命周期,这与任何生命周期对 Foo
类型值的引用不同( for<'a> &'a Foo
),并且与传递给 invoke
的引用不兼容打电话。
不将闭包传递给Caller
,编译器将能够正确推断回调的预期参数类型,包括引用生命周期。
克服这个问题的一种方法是重新定义 Caller
显式接收引用值作为回调参数。这会更改推断类型 &T
的行为进入更高排名的生命周期,如上所述。
fn main() {
let mut caller = Caller::new();
let callback = |x: &Foo| { println!("{:?}", x) };
caller.register(callback);
let foo = Foo { bar: 1, baz: 2 };
caller.invoke(&foo);
}
struct Caller<'a, T> {
callback: Box<dyn FnMut(&T) + 'a>,
}
impl<'a, T> Caller<'a, T> {
fn new() -> Self {
Caller {
callback: Box::new(|_| ()),
}
}
fn register(&mut self, cb: impl FnMut(&T) + 'a) {
self.callback = Box::new(cb);
}
fn invoke(&mut self, x: &T) {
(self.callback)(x);
}
}
使这一点更清楚的一种方法是使用 invoke
的扩展定义:
fn register<F>(&mut self, cb: F)
where
F: for<'b> FnMut(&'b T) + 'a
{
self.callback = Box::new(cb);
}
另请参阅:
关于rust - 如何将引用参数传递给盒装闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67482993/
我正在努力寻找任何教程来帮助我将 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
我是一名优秀的程序员,十分优秀!