Rust中FnOnce如何传递给一个约束Fn的回调

Rust中FnOnce如何传递给一个约束Fn的回调

下面的代码,set_cb(func);会报错,如何包装能够做到这样的效果:

复制代码
fn set_cb<F: Fn() + 'static>(handler: F)
{
    handler();
}

fn main() {
    let join_handle = std::thread::spawn(|| {});
    let func = || {
        join_handle.join().unwrap();
    };
    set_cb(func);
    // func();
}

解决方法

代码中的问题是你试图在闭包中捕获 join_handle,但 std::thread::JoinHandle 不满足 Fn trait,因为它不是 Clone 和 Copy。这就是为什么你不能直接捕获它并在闭包中使用。解决方法是使用 Arc<Mutex<...>> 来共享 JoinHandle。

这是一个修改后的例子:

复制代码
use std::sync::{Arc, Mutex};
use std::thread;

fn set_cb<F: Fn() + Send + 'static>(handler: F)
{
    handler();
}

fn main() {
    let join_handle = Arc::new(Mutex::new(Some(thread::spawn(|| {}))));
    let join_handle_clone = Arc::clone(&join_handle);

    let func = move || {
        let mut join_handle = join_handle_clone.lock().unwrap();
        join_handle.take().unwrap().join().unwrap();
    };

    set_cb(func);
}

在这个修改后的例子中,我们创建了一个 Arc<Mutex<Option>>。我们创建一个 Option,这样我们就可以在闭包中使用 take() 方法将其设置为 None,这样就可以将其移动出 Mutex,而无需在闭包中保持锁定。这样,我们就可以在 set_cb 调用中使用 join_handle,而无需担心所有权问题。

相关推荐
爱华晨宇20 分钟前
Python列表入门:常用操作与避坑指南
开发语言·windows·python
一切顺势而行26 分钟前
python 面向对象
开发语言·python
JaJian.1 小时前
Java后端服务假死问题排查与解决
java·开发语言
jjjxxxhhh1232 小时前
RSA加密解密代码
开发语言·c++
Sun_gentle2 小时前
java.lang.RuntimeException: Could not load wrapper properties from ‘C:\Users\
java·开发语言·安卓
键盘鼓手苏苏2 小时前
Flutter for OpenHarmony:git 纯 Dart 实现的 Git 操作库(在应用内实现版本控制) 深度解析与鸿蒙适配指南
开发语言·git·flutter·华为·rust·自动化·harmonyos
橙露2 小时前
面向对象编程思想:Java 与 Python 的封装、继承与多态对比分析
java·开发语言·python
ShineWinsu2 小时前
对于C++:模版进阶的解析
开发语言·c++·面试·笔试·求职·进阶·模版
啊哈哈121383 小时前
Python基本语法复盘笔记1(输入输出/字符串/列表)
开发语言·笔记·python
qq_150841993 小时前
3天基于VS2026的C#编程入门及动态调用CH341DLLA64读写I2C从机
开发语言·c#