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

这篇具有很好参考价值的文章主要介绍了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,而无需担心所有权问题。文章来源地址https://www.toymoban.com/news/detail-724412.html

到了这里,关于Rust中FnOnce如何传递给一个约束Fn的回调的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • rust里如何快速实现一个LRU 本地缓存?

    LRU是Least Recently Used(最近最少使用)的缩写,是一种常见的缓存淘汰算法。LRU算法的基本思想是,当缓存空间已满时,优先淘汰最近最少使用的数据,以保留最常用的数据。 在计算机系统中,LRU算法常用于缓存系统、页面置换算法等场景,以提高数据访问的效率和性能。 要

    2024年02月13日
    浏览(43)
  • 在 macOS 上安装 Rust 开发环境并运行第一个程序的详细步骤

    首先,打开终端并执行以下命令来安装 Rust 环境: 该命令将下载并运行 Rust 安装脚本。按照提示完成 Rust 环境的安装。 为了确保每次启动终端时都能加载 Rust 环境变量,我们需要将以下内容添加到 .zshrc 文件中。在终端中执行以下命令: 这将在 .zshrc 文件的末尾添加一行代码

    2024年02月02日
    浏览(50)
  • 用可视化案例讲Rust编程3. 函数分解与参数传递

    上一节我们在绘制面要素的时候,发现了函数功能体是三个不同步骤组成的: 读取文件获得geometry 把geometry转变为绘图元素trace 把绘图元素绘制到地图上 像我们上一节那样,把所有的功能都写在一个函数里面,这样的函数灵活性太差,例如我们要读取和绘制若干个点、线、面

    2024年01月25日
    浏览(97)
  • Rust UI开发(四):iced中如何添加菜单栏(串口调试助手)

    注:此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库,用于为rust语言程序构建UI界面。 这是一个系列博文,本文是第四篇,前三篇链接: 1、Rust UI开发(一):使用iced构建UI时,如何在界面显示中文字符 2、Rust UI开发(二):iced中如何为窗口添加icon图标 3、Rust

    2024年02月03日
    浏览(93)
  • 用Rust设计一个并发的Web服务:常用Rust库如Tokio、Hyper等,基于TCP/IP协议栈,实现了一个简单的并发Web服务器,并结合具体的代码讲解如何编写并发Web服务器的程序

    作者:禅与计算机程序设计艺术 1994年,互联网泡沫破裂,一批优秀的程序员、工程师纷纷加入到web开发领域。而其中的Rust语言却备受瞩目,它是一种现代系统编程语言,专注于安全和并发。因此,Rust在当下成为最流行的编程语言之一,很多框架也开始使用Rust重构,这使得

    2024年02月06日
    浏览(62)
  • Rust UI开发(一):使用iced构建UI时,如何在界面显示中文字符

    注:此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库,用于为rust语言程序构建UI界面。   iced的基本逻辑是: UI交互产生消息message,message传递给后台的update,在这个函数中编写逻辑,然后通过View函数更新UI。 Take the result of our view logic and layout its widgets. 获取视图逻

    2024年02月03日
    浏览(79)
  • Rust UI开发(三):iced如何打开图片(对话框)并在窗口显示图片?

    注:此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库,用于为rust语言程序构建UI界面。 这是一个系列博文,本文是第三篇,前两篇的链接: 1、Rust UI开发(一):使用iced构建UI时,如何在界面显示中文字符 2、Rust UI开发(二):iced中如何为窗口添加icon图标 本篇是

    2024年02月04日
    浏览(95)
  • 【ChatGPT辅助学Rust | 基础系列 | Hello, Rust】编写并运行第一个Rust程序

    在开始学习任何一门新的编程语言时,都会从编写一个简单的 “Hello, World!” 程序开始。在这一章节中,将会介绍如何在Rust中编写并运行第一个程序。 在终端中,使用Cargo(Rust的构建系统和包管理器)创建一个新的二进制项目。输入以下命令: 这将会在当前目录下创建一个

    2024年02月14日
    浏览(59)
  • 【Rust】Rust学习 第十二章一个 I/O 项目:构建一个命令行程序

    本章既是一个目前所学的很多技能的概括,也是一个更多标准库功能的探索。我们将构建一个与文件和命令行输入/输出交互的命令行工具来练习现在一些你已经掌握的 Rust 技能。 Rust 的运行速度、安全性、单二进制文件输出和跨平台支持使其成为创建命令行程序的绝佳选择,

    2024年02月12日
    浏览(50)
  • 【Rust日报】用Rust从头实现一个C编译器

    一个声明式解析库 Untwine 发布0.4 Untwine是一个声明性解析库,它允许一种类似于使用自定义宏语法进行直接模式匹配的解析风格。这允许创建具有良好性能特征和高质量错误消息的极其紧凑的解析器。这些解析器实现起来很简单,有几个精心挑选的例子: 一个几乎完整的JSO

    2024年04月22日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包