首页 > 其他分享 >Rust中的函数指针

Rust中的函数指针

时间:2023-05-04 09:33:45浏览次数:41  
标签:闭包 do 函数 i32 fn 函数指针 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)中非常常见,例如 map 和 filter 等。

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

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

函数指针的优缺点

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

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

标签:闭包,do,函数,i32,fn,函数指针,Rust
From: https://www.cnblogs.com/gongyic/p/17370147.html

相关文章

  • 用了这么多年Rust终于搞明白了内存分布!
    导读Rust作为一门学习曲线十分陡峭的语言,掌握其核心基础数据结构的内存分布对学习Rust会有很大的帮助,本文由浅入深仔细介绍了Rust的各个数据结构在内存中的分布情况。Rust作为一门学习曲线十分陡峭的语言,掌握其核心基础数据结构的内存分布对学习Rust会有很大的......
  • rust 更新HashMap
    在更新HashMap的时候,有以下几个常见的情况fnmain(){usestd::collections::HashMap;letmutscores=HashMap::new();scores.insert("Blue",10);//覆盖已有的值,返回一个Option类型,返回旧的值letold=scores.insert("Blue",20);assert_e......
  • rust中动态数组的引用和切片
    真逆天这个b语法1切片与String切片类似,动态数组Vec也能切片,通过&取切片般如果Vec是可变的话,那么他的切片就是不可变的/只读的注意:切片和&Vec是不同的类型,后者仅仅是Vec的引用,并可以通过解引用直接获取Vecfnmain(){letmutv=vec![1,2,3];letslice=&......
  • 函数指针与函数回调
     1、函数指针 C/C++中可以使用指针指向一段代码,这个指针就叫函数指针,假设有这样一段代码:#include<stdio.h>intfunc(inta){returna+1;}voidmain(){int(*f)(int)=func;printf("%p\n",f);}定义了一个函数func,然后使用指针变量f指向该函数,然后......
  • Rust: CTP的rust版本如何手工封装
    https://blog.csdn.net/wowotuo/article/details/86669758这里指的手工封装,是指不用外部类似swig专用的库。一、库、配置1、DLL交互的库(1)libloadinghttps://github.com/nagisa/rust_libloading(2)libcRawFFIbindingstoplatformlibrarieslikelibc.https://github.com/rust-......
  • rust完全限定语法
    <TypeasTrait>::function(receiver_if_method,next_arg,...);上面定义中,第一个参数是方法接收器receiver(三种self),只有方法才拥有,例如关联函数就没有receiver。一般情况下,rust的编译器能够自动推导。只有当存在多个同名函数或方法,且Rust无法区分出你想调用的目标函数时,......
  • Vulhub 漏洞学习之:Strust2
    Vulhub漏洞学习之:Strust2目录Vulhub漏洞学习之:Strust21S2-001远程代码执行漏洞1.1环境安装1.2漏洞利用过程1.3GetShell2S2-005远程代码执行漏洞环境2.1环境安装2.2漏洞利用过程2.3GetShell3S2-007远程代码执行漏洞3.1环境安装3.2漏洞利用过程3.3GetShell4S2-0......
  • rust中的self与Self
    selfself是一个代表类型实例(或者是类型的引用或者是值)的关键字,在Rust的方法中使用self可以引用当前类型的实例或者类型本身。具体来说,当我们定义一个方法时,使用self关键字作为方法的第一个参数可以让我们在调用该方法时直接访问类型实例本身structPoint{x:f32,......
  • Rust -- 模式与匹配
    1.模式用来匹配类型中的结构(数据的形状),结合模式和match表达式提供程序控制流的支配权模式组成内容字面量解构的数组、枚举、结构体、元祖变量通配符占位符流程:匹配值-->是否拥有正确的数据-->运行特定的代码2.使用模式的位置match分支:由match关键字、......
  • 12 | C语言中的函数类型和函数指针类型
    函数类型和函数指针类型的区别,让我们先看一个例子#include<iostream>usingnamespacestd;typedefint(Func)(int);typedefint(*Func_p)(int);intf(inta){returna;}intmain(){Func_pp=f;Func*p_ptr=f;cout<<p(0)<<endl;cout<<p_ptr(1)......