Rust闭包实例分析
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇"Rust闭包实例分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"Rust闭包
千家信息网最后更新 2026年11月01日Rust闭包实例分析我们知道 Rust 的闭包不仅是一个函数指针,这意味着不能使用它作为回调函数的函数指针直接传递给 C 端。 同时我们也知道 Rust 中的所有的闭包都实现了由标准库提供的 trait 因此,从理论上讲,我们应该能够通过将闭包"拆分"为两部分,匿名类型的实例数据和某种类似 具体的方法就是:首先创建一个泛型 hook 函数,该函数和回调函数的参数列表一样,在其中构建并调用闭包。然后创建一个 getter 函数,该函数接受闭包的引用作为参数,返回一个函数指针。 我们沿用上篇设计的示例,稍作修改: 好,代码部分 C 端保持不变,我们看 Rust 端的两个函数 由于我们希望闭包能改变其环境,所以在定义 同时 接下来我们 Rust 端的主函数,代码如下: 这个 接着我们调用 同时在调用 C 端函数
这篇"Rust闭包实例分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"Rust闭包实例分析"文章吧。
闭包
Fn 、 FnMut 或 FnOnce 中的一个。闭包语法 || {} 实际上是 Fn 系列 trait 的语法糖,Rust 会为"环境"创建一个结构体, impl 其中合适的一个 trait,并使用它。call() 方法的函数。这样我们可以获取其中函数部分的指针,从而实现将闭包传递给 C 端代码。C 端, sum_square_cb函数,接收两个整型参数 a, b,一个函数指针,一个void *;Rust 端,定义一个 getter 函数 get_callback;Rust 端,定义一个闭包,被调用时更新数据 user_data; Rust 端,调用 C 中定义的 sum_square_cb;
hook 和 get_callback ,代码如下:// ffi/example_10/src/main.rsunsafe extern fn hook(result: c_int, user_data: *mut c_void) whereF: FnMut(c_int),{let closure = &mut *(user_data as *mut F);closure(result);}pub fn get_callback(_closure: &F) -> SumSquareCB whereF: FnMut(c_int),{hook::}
hook 函数时,我们限定闭包实现为 FnMut 并以 c_int 作为参数。在函数体中的这一句 let closure = &mut *(user_data as *mut F); ,先通过把 *mut c_void 指针转换成 *mut F 指针,然后用 * 取得它的数据块,并使用 &mut 取得可变引用 ,最后调用闭包。get_callback 函数中仅有的语句, hook:: ,我们使用了一个叫做 turbofish ::<> 的语法,用来显式指定返回 F 类型的 hook 函数。fn main() {let mut record = SumRecord::default();unsafe {let mut closure = |result: c_int| {record.total += result;record.calls += 1;};let callback = get_callback(&closure);sum_square_cb(1, 2, callback, &mut closure as *mut _ as *mut c_void);sum_square_cb(3, 4, callback, &mut closure as *mut _ as *mut c_void);}println!("The sum is {:?}", record);}
let mut closure 语句意味着 closure 包含一个匿名函数的 定义,而不是调用后的 返回值,该函数接受一个 c_int 类型的参数。我们使用闭包的原因是需要事先定义一段代码,并在之后的某个时候才实际调用它。这里我们将期望调用的代码储存在了 closure 中。get_callback ,其中有一点非常重要,它返回的函数指针只能在传入的同一闭包上使用。因为我们定义 hook 函数时在未进行任何类型检查的情况下,将 user_data 直接转换为该闭包类型的指针。sum_square_cb 时,我们通过获取闭包变量 closure 的可变引用,并进行两次指针转换,将其强制转换为 void * 指针来获取其数据。其中我们使用了 _ 占位符由 Rust 编译器来推断该位置的闭包类型。以上就是关于"Rust闭包实例分析"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。
函数
闭包
指针
代码
类型
内容
参数
实例
数据
实例分析
分析
同时
语法
部分
两个
实际
就是
意味
文章
方法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
咖啡豆
科技金融是不是互联网金融
互联网科技与金融科技
青岛互联网科技公司
互联网科技集团
杭州互联网科技公司
朗涯互联网科技
西安互联网科技公司
互联网科技视频素材
西藏七维空间互联网科技有限公司
成都互联网科技公司100强
河南猎农互联网科技有限公司
互联网科技人工智能实验室
互联网金融科技公司的优势
每天都有哪些好的互联网科技
雨阳互联网卡科技有限公司
互联网领先科技宣传片
宁波跨境商互联网科技有限公司
普陀区互联网教育科技管理办法
悟空问答互联网科技
善班互联网科技
远信互联网科技
互联网科技有限公司 翻译
互联网科技项目计划书材料类
中国航天科技大学国际工业互联网
互联网科技研发水平
朱啸虎曾投资哪些互联网科技企业
互联网数据科技专业
10位科技互联网大佬
科技美学互联网 艺术