您好,登錄后才能下訂單哦!
這篇“Rust閉包實例分析”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Rust閉包實例分析”文章吧。
Fn
、
FnMut
或
FnOnce
中的一個。閉包語法
|| {}
實際上是
Fn
系列 trait 的語法糖,Rust 會為“環境”創建一個結構體,
impl
其中合適的一個 trait,并使用它。call()
方法的函數。這樣我們可以獲取其中函數部分的指針,從而實現將閉包傳遞給 C 端代碼。sum_square_cb
函數,接收兩個整型參數 a, b,一個函數指針,一個 void *
;get_callback
;sum_square_cb
;hook
和
get_callback
,代碼如下:// ffi/example_10/src/main.rs
unsafe extern fn hook<F>(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<F>(_closure: &F) -> SumSquareCB
where
F: FnMut(c_int),
{
hook::<F>
}
hook
函數時,我們限定閉包實現為
FnMut
并以
c_int
作為參數。在函數體中的這一句
let closure = &mut *(user_data as *mut F);
,先通過把
*mut c_void
指針轉換成
*mut F
指針,然后用
*
取得它的數據塊,并使用
&mut
取得可變引用 ,最后調用閉包。get_callback
函數中僅有的語句,
hook::<F>
,我們使用了一個叫做 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閉包實例分析”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。