Rust中的函数指针

news2025/1/16 21:38:26

什么是函数指针

通过函数指针允许我们使用函数作为另一个函数的参数。函数的类型是 fn (使用小写的 ”f” )以免与 Fn 闭包 trait 相混淆。fn 被称为 函数指针(function pointer)。指定参数为函数指针的语法类似于闭包。

函数指针类型(使用关键字 fn 写出)指向那些在编译时不必知道函数标识符的函数。它们也可以由函数项类型或非捕获(non-capturing)闭包经过一次自动强转(coercion)来创建

如何在Rust中定义和使用函数指针

下面是一个简单的代码示例,它演示了如何在Rust中定义和使用函数指针:

fn add_one(x: i32) -> i32 {
x + 1 
} 
fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 {
f(arg) + f(arg) 
} 
fn main() { 
let answer = do_twice(add_one, 5);
println!("The answer is: {}", answer); 
}
复制代码

这会打印出 The answer is: 12。do_twice 中的 f 被指定为一个接受一个 i32 参数并返回 i32 的 fn。接着就 可以在 do_twice 函数体中调用 f。在 main 中,可以将函数名 add_one 作为第一个参数传递给 do_twice。

函数指针与闭包的区别

函数指针和闭包都可以用来表示可调用对象,但它们之间有一些重要的区别。其中一个区别是,闭包可以捕获其周围环境中的变量,而函数指针则不能。

不同于闭包,fn 是一个类型而不是一个 trait,所以直接指定 fn 作为参数而不是声明一个带有 Fn 作为 trait bound 的泛型参数。

函数指针实现了所有三个闭包 trait(Fn、FnMut 和 FnOnce),所以总是可以在调用期望闭包的函数时 传递函数指针作为参数。

倾向于编写使用泛型和闭包 trait 的函数,这样它就能接受函数或闭包作为参数。 一个只期望接受 fn 而不接受闭包的情况的例子是与不存在闭包的外部代码交互时:C 语言的函数可以接受函数作为参数,但 C 语言没有闭包。

函数指针的应用场景

  • 可以作为参数传递给其他函数,以便在函数内部调用。这在一些高阶函数(higher-order functions)中非常常见,例如 map 和 filter 等。

  • 函数指针还可以用于定义回调函数(callback functions),例如在事件驱动编程(event-driven programming)中。

  • 函数指针还可以存储在数据结构中,以便稍后调用。这在一些算法中非常有用,例如排序算法。

函数指针的优缺点

函数指针的优点之一是它们没有运行时开销。这意味着它们可以在不影响性能的情况下用于表示可调用对象。

但是,函数指针也有一些局限性。例如,它们不能捕获其周围环境中的变量,这使得它们不如闭包灵活。此外,函数指针只能指向那些在编译时已知的函数,这意味着它们不能用于表示匿名函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1628360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里前端常考vue面试题汇总_阿里高级vue面试题

改变 ![](https://img-blog.csdnimg.cn/img_convert/b736620bcd29f08f3685022ab5583d8b.webp?x-oss-processimage/format,png)你会发现, **只有改变的栏目才闪烁,也就是进行重绘** ,数据没有改变的栏目还是保持原样,这样就大大节…

(3)C程序可执行文件的生成过程

原文链接:https://www.jianshu.com/p/b7e44f749211 一、可执行文件的生成 我们先通过一个简单C程序,回顾一下可执行文件的生成过程。 ​​​​​​​ ​​​​​​​ 可执行文件的生成过程如下图: 如图,可执行文…

Java学习路线及自我规划

荒废了一段时间,这段时间的总结开始了JavaWeb的学习但是困难重重,例如Maven,Vue的路由等,所以我反省了一段时间,因为基础薄弱,加之学习的资源是速成视频,导致大厦将倾的局面(也算不上…

为什么如果重写了某个类的equals方法,还必须重写对应的hashcode方法?

为什么如果重写了某个类的equals方法,还必须重写对应的hashcode方法? 答: 保证equals相同的两个对象hashcode必须相同的原则。不重写hashcode方法的的话,若用hashmap/hashset等散列表存储这个类,可能会出现两个相同对…

IDEA上配置Maven环境

1.选择IDEA中的Setting 2.搜索maven 3.设置IDEA使用本地安装的Maven,并修改配置文件路径 配置文件,本地仓库,阿里云仓库配置及路径教程 在IDEA上配置完成。

java中http调用组件深入详解

目录 一、前言 二、http调用概述 2.1 什么是http调用 2.1.1 http调用步骤 2.2 HTTP调用特点 2.3 HTTP调用应用场景 三、微服务场景下http调用概述 3.1 微服务开发中http调用场景 3.2 微服务组件中http的应用 四、常用的http调用组件 4.1 java中常用的http组件介绍 4…

输入输出重定向,追加重定向(Linux)

文章目录 一、输出重定向二、追加重定向三.输入重定向总结 一、输出重定向 我们在使用echo内容时,会把内容显示在显示器上。 echo自动换行。 我们如果输入 echo “hello linux” >file.txt 我们运行一下就会发现系统中多了一个file.txt的文件,如果这…

【C++打怪之路Lv3】-- 类和对象(上)

🌈 个人主页:白子寰 🔥 分类专栏:C打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~ 💡 坚持创作博文(平均质量分82)&#…

C++必修:类与对象(一)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C学习 贝蒂的主页:Betty’s blog 1. 面向过程与面向对象 1.1. 面向过程 我们之前学习的C语言就是一种面向过程的语…

plsql 新建sql窗口 初始化慢的问题

问题描述: 新建sql窗口当sql语句多的情况下初始化很慢。 解决方法: 采用导入表的方式。 具体方式 工具->导入表->sql插入。 使用命令窗口 导入文件,然后点击导入按钮。

【力扣 Hot100 | 第七天】4.22(找到字符串中所有字母异位词)

文章目录 2.找到字符串中所有字母异位词2.1题目2.2解法:滑动窗口2.2.1解题思路2.2.2代码实现 2.找到字符串中所有字母异位词 2.1题目 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺…

Spring Security认证流程分析

我自己的思路 先分别实现 userdetailsService,userDetails,passwordEncoder三个接口, 然后就是写登录逻辑 本文章用的是继承UsernamePasswordAuthenticationFilter这个接口 因为这个框架默认登录逻辑是在这里面的,里面的核心就是…

vivado 使用“链路 (Links)”窗口查看和更改链路设置

使用“链路 (Links) ”窗口查看和更改链路设置 创建链路后 , 就会将其添加到“ Links ”视图 ( 请参阅下图 ) 中 , 该视图是更改链路设置和查看状态的主要方法 , 也是最佳方法。 “ Links ”窗口中的每一行都对应 1 …

018基于SSM的音乐系统网站

018基于SSM的音乐系统/网站 开发环境: Jdk7(8)Tomcat7(8)MysqlIntelliJ IDEA(Eclipse)Maven 数据库: MySQL 技术: SpringSpring mvcMybatisJqueryVideo jsJSPJSTLEasyUI 适用于: 课程设计,毕业设计,学习…

航拍图像拼接 | 使用C++实现的无人机航拍图像拼接

项目应用场景 面向无人机航拍图像拼接场景,项目使用 C 实现,使用 harris 角点查找特征点 非极大值抑制,由于航拍图像没有严重的尺度旋转变化,使用了 berief 描述子,然后使用 RANSAC 求 H,最后进行图像拼接…

python入门完结篇(6)

插入: 1.使用append的方法,使用append往列表末尾新增一个元素。此处的append的是搭配列表对象来使用的,而不是作为一个独立的函数. 而 type print input len自定义函数都是独立的函数,不用搭配任何对象. 而这种需要搭配对象(变量&#xff09…

Ubuntu Mysql修改密码时遇到的问题

参考: ubuntu18.04 首次登录mysql未设置密码或忘记密码解决方法_ubuntu中mysql设置密码-CSDN博客 1. use mysql; #连接到mysql数据库 2. update mysql.user set authentication_stringpassword(123456) where userroot and Host localhost; #修改密码123456是密码…

解决iOS开发不能使用HTTP请求的问题

苹果公司在iOS9中升级了应用网络通信安全策略,默认推荐开发者使用HTTPS协议来进行网络通信,并限制HTTP协议的请求。为了解决这个问题,我们需要在info.plist文件中增加如下配置来实现广告的网络访问:(信任HTTP请求&…

【算法基础实验】图论-构建无向图

构建无向图 前提 JAVA实验环境 理论 无向图的数据结构为邻接表数组,每个数组中保存一个Bag抽象数据类型(Bag类型需要专门讲解) 实验数据 我们的实验数据是13个节点和13条边组成的无向图,由一个txt文件来保存,本…

数字旅游引领智慧化浪潮:科技创新重塑旅游体验,智慧服务打造旅游新高度

在科技飞速发展的今天,数字旅游正以其独特的魅力引领着智慧化浪潮,深刻改变着旅游行业的面貌。数字技术的广泛应用,不仅为旅游行业注入了新的活力,也极大地提升了旅游体验的品质。科技创新与智慧服务的融合,正推动着旅…