Rust闭包实例分析
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,这篇"Rust闭包实例分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"Rust闭包
千家信息网最后更新 2025年12月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安全错误
数据库的锁怎样保障安全
应届毕业生简历软件开发
赛博朋克怎么打开数据库
舟山桌面软件开发流程
哪一年开始国家网络安全周
涉密软件开发项目管理标准
网络安全为主题作文题目要求
蒲公英数据库
数据库的关系模式1nf
泉州零工科技互联网有限公司
蚌埠网络安全考试题库
unraid 打印服务器
保定网络服务器机柜安装工程
计算机网络技术 期中试题
hive建数据库的语句
服务器文件共享软件破解版下载
汽车网络技术讲解
烟台安凯网络技术有限公司
下拉框数据库设计
廊坊云财务软件网络技术
微信怎么一直在载入数据库
岩心数据库标准
崇明区互联网教育科技诚信经营
武汉培训软件开发服务费
广州市超宝网络技术有限公司
韩国女vs日本女数据库
大宗软件开发谁家好
网络安全 涉黄 行政处罚
多玩 魔兽 数据库
思科网络技术公司
电子商务网络安全大计事