保留在闭包中使用的值以备后用

Keep value used in closure for later use

提问人:Barbapapoy 提问时间:9/4/2022 更新时间:9/4/2022 访问量:41

问:

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 关键字,我会得到一个终身错误,如果我使用它,我将无法稍后在函数中分配我的回调。解决此问题的正确方法是什么?

Rust 回调 闭包

评论


答:

1赞 kmdreko 9/4/2022 #1

你将不得不这样做。.clone()

仅适用于 的函数,这意味着它们不能保存对局部变量的引用。如果它允许这样做,那么在完成后调用该闭包将尝试使用悬空引用,因为已经删除了。Closure'staticcallback_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()));
}