這篇“Rust閉包實例分析”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Rust閉包實例分析”文章吧。
我們提供的服務(wù)有:網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、佳木斯ssl等。為上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的佳木斯網(wǎng)站制作公司
Fn
、
FnMut
或
FnOnce
中的一個。閉包語法
|| {}
實際上是
Fn
系列 trait 的語法糖,Rust 會為“環(huán)境”創(chuàng)建一個結(jié)構(gòu)體,
impl
其中合適的一個 trait,并使用它。call()
方法的函數(shù)。這樣我們可以獲取其中函數(shù)部分的指針,從而實現(xiàn)將閉包傳遞給 C 端代碼。sum_square_cb
函數(shù),接收兩個整型參數(shù) a, b,一個函數(shù)指針,一個 void *
;get_callback
;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
函數(shù)時,我們限定閉包實現(xiàn)為
FnMut
并以
c_int
作為參數(shù)。在函數(shù)體中的這一句
let closure = &mut *(user_data as *mut F);
,先通過把
*mut c_void
指針轉(zhuǎn)換成
*mut F
指針,然后用
*
取得它的數(shù)據(jù)塊,并使用
&mut
取得可變引用 ,最后調(diào)用閉包。get_callback
函數(shù)中僅有的語句,
hook::
,我們使用了一個叫做 turbofish
::<>
的語法,用來顯式指定返回
F
類型的
hook
函數(shù)。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
包含一個匿名函數(shù)的 定義,而不是調(diào)用后的 返回值,該函數(shù)接受一個
c_int
類型的參數(shù)。我們使用閉包的原因是需要事先定義一段代碼,并在之后的某個時候才實際調(diào)用它。這里我們將期望調(diào)用的代碼儲存在了
closure
中。get_callback
,其中有一點非常重要,它返回的函數(shù)指針只能在傳入的同一閉包上使用。因為我們定義
hook
函數(shù)時在未進行任何類型檢查的情況下,將
user_data
直接轉(zhuǎn)換為該閉包類型的指針。sum_square_cb
時,我們通過獲取閉包變量
closure
的可變引用,并進行兩次指針轉(zhuǎn)換,將其強制轉(zhuǎn)換為
void *
指針來獲取其數(shù)據(jù)。其中我們使用了
_
占位符由 Rust 編譯器來推斷該位置的閉包類型。以上就是關(guān)于“Rust閉包實例分析”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。