Rust闭包实例分析
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,这篇"Rust闭包实例分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"Rust闭包
千家信息网最后更新 2025年01月31日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.rs
unsafe extern fn hook
(result: c_int, user_data: *mut c_void) where
F: FnMut(c_int),
{
let closure = &mut *(user_data as *mut F);
closure(result);
}
pub fn get_callback
(_closure: &F) -> SumSquareCB where
F: 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安全错误
数据库的锁怎样保障安全
网络安全dlp品牌
ios越狱后数据库丢失
微信数据库的文件在哪里
免费服务器吧
如何确认服务器已磁盘阵列
服务器启动管理处u盘不显示
四合院效果图软件开发
数据库数据共享是指
江北游戏软件开发公司
大学生网络安全的观点
wps数据库介绍
网络安全法第几部全面规范
软件开发套件是干什么的
原神各个服务器名字能不能重复
阿里数据库同步组件
存储长文本最适合的数据库
金像软件开发有限公司招聘
租服务器怎么测带宽
新疆农信软件开发
魔兽世界轮回服怎么选择服务器
2020年软件开发的税率
拒绝root模式访问数据库
微小软件开发
1.12魔兽世界数据库
opensips数据库
网络安全大咖
服务器和客户机的区别有什么
数据库连接采用什么技术
网络代理服务器怎么做
软件开发公司去哪儿找