簡體   English   中英

規避閉包借用的變量生命周期限制

[英]Circumventing closure-borrowed variable lifetime limits

我使用以下代碼在每次發生RedrawRequested事件(由 Glium 發出)時運行我的render::exec function:

event_loop.run(move |event, _, control_flow| {
    match event {
        Event::RedrawRequested(_) => {
            let mut target = display.draw();
            render::exec(&mut target, &mut ctx, &font, &mut cache);
            target.finish().unwrap();
        }

        // ...

        _ => ()
    }
});

問題是,我在&font參考中收到以下錯誤:

borrowed data cannot be stored outside of its closure

font確實是在調用event_loop.run之前創建的,因為它是一個rusttype::Font結構,我需要它來在我的 Glium 應用程序中呈現文本。 我知道,由於這是一個move閉包,來自font的數據將在其末尾被釋放,因此借用檢查器不允許在閉包之外創建font ,因為不能確保閉包不會被多次調用(實際上,它多次調用)。

我試圖通過刪除move關鍵字來規避這一點,但隨后我從閉包內部借用的每個變量都會觸發以下錯誤:

closure may outlive the current function, but it borrows `ctx`, which is owned by the current function
may outlive borrowed value `ctx`

我知道,由於借用檢查器無法確保這些變量至少與閉包一樣長,因此它不允許從前者內部引用后者。

因此,我需要一種方法來確保借用檢查器這些變量持續時間至少與閉包一樣長 通常這樣做的一種方法是將它們作為參數傳遞給閉包,但實際上我無法更改傳遞的參數列表,因為我使用的是event_loop.run ,它具有以下簽名:

pub fn run<F>(self, event_handler: F) -> !
where F: 'static + FnMut(Event<'_, T>, &EventLoopWindowTarget<T>, &mut ControlFlow)

我瀏覽了 Glutin 文檔,找不到將任何數據存儲到EventLoop (這是取消引用EventLoopWindowTarget提供的類型)中的方法,也找不到作為參數傳遞的ControlFlow中的方法。

font 確實是在調用 event_loop.run 之前創建的,因為它是一個 rusttype::Font 結構,我需要它來在我的 Glium 應用程序中呈現文本。 我知道,由於這是一個移動閉包,來自字體的數據將在其末尾被釋放,因此借用檢查器不允許在閉包之外創建字體,因為不能確保閉包不會被多次調用(實際上,它被多次調用)。

這是不正確的。 它並不關心font是在閉包之前創建的,因為它是在之后移動閉包中的。 同樣多次調用閉包,沒關系,字體現在屬於閉包。

閉包是具有關聯 function 的結構,作為環境一部分的所有變量實際上都設置為結構的成員,當調用 function 以填充自由變量時,可以從中提取它們。 就是這樣。 在閉包之外創建項目(否則您將如何關閉它們?)或多次調用閉包沒有具體問題。

let font = Font;
let t: u8 = (0..5).map(move |_| Font::thing(&font)).sum();

錯誤的意思是,在閉包內你正在借用一些東西,而你正試圖將那個借用移到閉包之外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM