提问人:Barbapapoy 提问时间:9/4/2022 更新时间:9/4/2022 访问量:41
保留在闭包中使用的值以备后用
Keep value used in closure for later use
问:
fn callback_test() {
let image = HtmlImageElement::new().unwrap();
let callback: Closure<dyn Fn()> = {
Closure::wrap(Box::new(|| {
image.set_src("foo");
}))
};
image.set_onload(Some(&callback.as_ref().unchecked_ref()));
}
这是我试图实现的一个例子。如果我在闭包声明之前不使用 move 关键字,我会得到一个终身错误,如果我使用它,我将无法稍后在函数中分配我的回调。解决此问题的正确方法是什么?
答:
1赞
kmdreko
9/4/2022
#1
你将不得不这样做。.clone()
仅适用于 的函数,这意味着它们不能保存对局部变量的引用。如果它允许这样做,那么在完成后调用该闭包将尝试使用悬空引用,因为已经删除了。Closure
'static
callback_test()
image
因此,将其放入闭包中是正确的举动。由于您必须在创建闭包后再次使用它,因此您需要两个副本才能使用。move
试试这个:
fn callback_test() {
let image = HtmlImageElement::new().unwrap();
let callback: Closure<dyn Fn()> = {
let image = image.clone();
Closure::wrap(Box::new(move || {
image.set_src("foo");
}))
};
image.set_onload(Some(&callback.as_ref().unchecked_ref()));
}
评论