中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Rust閉包實例分析

發布時間:2022-04-27 11:14:19 來源:億速云 閱讀:234 作者:iii 欄目:大數據

這篇“Rust閉包實例分析”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Rust閉包實例分析”文章吧。

閉包
我們知道 Rust 的閉包不僅是一個函數指針,這意味著不能使用它作為回調函數的函數指針直接傳遞給 C 端。
同時我們也知道 Rust 中的所有的閉包都實現了由標準庫提供的 trait    Fn  、  FnMut   或    FnOnce   中的一個。閉包語法    || {}   實際上是    Fn   系列 trait 的語法糖,Rust 會為“環境”創建一個結構體,  impl  其中合適的一個 trait,并使用它。
因此,從理論上講,我們應該能夠通過將閉包“拆分”為兩部分,匿名類型的實例數據和某種類似  call()  方法的函數。這樣我們可以獲取其中函數部分的指針,從而實現將閉包傳遞給 C 端代碼。
具體的方法就是:首先創建一個泛型 hook 函數,該函數和回調函數的參數列表一樣,在其中構建并調用閉包。然后創建一個 getter 函數,該函數接受閉包的引用作為參數,返回一個函數指針。
我們沿用上篇設計的示例,稍作修改:
  1. C 端, sum_square_cb  函數,接收兩個整型參數 a, b,一個函數指針,一個 void *
  2. Rust 端,定義一個 getter 函數  get_callback
  3. Rust 端,定義一個閉包,被調用時更新數據 user_data;
  4. Rust 端,調用 C 中定義的  sum_square_cb
好,代碼部分 C 端保持不變,我們看 Rust 端的兩個函數  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) -> SumSquareCBwhere    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  函數。
接下來我們 Rust 端的主函數,代碼如下:
  
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  直接轉換為該閉包類型的指針。
同時在調用 C 端函數  sum_square_cb  時,我們通過獲取閉包變量    closure  的可變引用,并進行兩次指針轉換,將其強制轉換為    void *   指針來獲取其數據。其中我們使用了  _  占位符由 Rust 編譯器來推斷該位置的閉包類型。

以上就是關于“Rust閉包實例分析”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節
推薦閱讀:
  1. Python 閉包
  2. lua 閉包

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蛟河市| 礼泉县| 如皋市| 彰武县| 湟源县| 新津县| 南靖县| 高邮市| 开远市| 安平县| 永善县| 城市| 招远市| 嘉黎县| 长子县| 昌邑市| 朔州市| 鄱阳县| 武汉市| 潜江市| 阳春市| 从江县| 合江县| 舞阳县| 商丘市| 绩溪县| 乌拉特前旗| 银川市| 长沙市| 肇源县| 治多县| 长岛县| 太保市| 荥阳市| 临泉县| 盐山县| 三门县| 平安县| 桦川县| 广州市| 永清县|