真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Rust閉包實例分析

這篇“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)站制作公司

閉包
我們知道 Rust 的閉包不僅是一個函數(shù)指針,這意味著不能使用它作為回調(diào)函數(shù)的函數(shù)指針直接傳遞給 C 端。
同時我們也知道 Rust 中的所有的閉包都實現(xiàn)了由標準庫提供的 trait    Fn  、  FnMut   或    FnOnce   中的一個。閉包語法    || {}   實際上是    Fn   系列 trait 的語法糖,Rust 會為“環(huán)境”創(chuàng)建一個結(jié)構(gòu)體,  impl  其中合適的一個 trait,并使用它。
因此,從理論上講,我們應(yīng)該能夠通過將閉包“拆分”為兩部分,匿名類型的實例數(shù)據(jù)和某種類似  call()  方法的函數(shù)。這樣我們可以獲取其中函數(shù)部分的指針,從而實現(xiàn)將閉包傳遞給 C 端代碼。
具體的方法就是:首先創(chuàng)建一個泛型 hook 函數(shù),該函數(shù)和回調(diào)函數(shù)的參數(shù)列表一樣,在其中構(gòu)建并調(diào)用閉包。然后創(chuàng)建一個 getter 函數(shù),該函數(shù)接受閉包的引用作為參數(shù),返回一個函數(shù)指針。
我們沿用上篇設(shè)計的示例,稍作修改:
  1. C 端, sum_square_cb  函數(shù),接收兩個整型參數(shù) a, b,一個函數(shù)指針,一個 void * ;
  2. Rust 端,定義一個 getter 函數(shù)  get_callback ;
  3. Rust 端,定義一個閉包,被調(diào)用時更新數(shù)據(jù) user_data;
  4. Rust 端,調(diào)用 C 中定義的  sum_square_cb ;
好,代碼部分 C 端保持不變,我們看 Rust 端的兩個函數(shù)  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) -> SumSquareCBwhere    F: FnMut(c_int),{    hook::}
 
由于我們希望閉包能改變其環(huán)境,所以在定義  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ù)。
接下來我們 Rust 端的主函數(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   中。
接著我們調(diào)用  get_callback  ,其中有一點非常重要,它返回的函數(shù)指針只能在傳入的同一閉包上使用。因為我們定義  hook  函數(shù)時在未進行任何類型檢查的情況下,將  user_data  直接轉(zhuǎn)換為該閉包類型的指針。
同時在調(diào)用 C 端函數(shù)  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è)資訊頻道。


分享文章:Rust閉包實例分析
分享地址:http://weahome.cn/article/ijhpsi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部