Rust中的函数指针

什么是函数指针

通过函数指针允许我们使用函数作为另一个函数的参数。函数的类型是 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)中非常常见,例如 mapfilter 等。

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

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

函数指针的优缺点

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

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

相关推荐
鹏程十八少12 小时前
12. Android 协程通关秘籍:31 道资深工程师面试题精讲
前端·后端·面试
铅笔小新z12 小时前
【C语言】数据类型和变量
c语言·开发语言
code_whiter12 小时前
C++11(stack和queue)
开发语言·c++
最后一支迷迭香12 小时前
苹果的MacOS系统适合做Java开发吗
java·开发语言·macos
m0_7390300012 小时前
[特殊字符] Java 高频面试题汇总
java·开发语言·面试
白宇横流学长12 小时前
基于Spring Boot的校园考勤管理系统的设计与实现
java·spring boot·后端
2zcode12 小时前
基于MATLAB的5G物理层文本传输系统仿真与性能分析
开发语言·5g·matlab
ReSearch12 小时前
sfsEdgeStore:边缘计算时代的轻量级数据存储解决方案
数据库·后端·github
feifeigo12313 小时前
基于布谷鸟算法的配电网分布式电源选址定容 MATLAB 实现
开发语言·算法·matlab
SamDeepThinking13 小时前
拼单模块设计实战
java·后端·架构