當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust AssertUnwindSafe用法及代碼示例


本文簡要介紹rust語言中 Struct std::panic::AssertUnwindSafe 的用法。

用法

pub struct AssertUnwindSafe<T>(pub T);

一個類型的簡單包裝器,用於斷言它是展開安全的。

使用 catch_unwind 時,可能會出現一些封閉變量不是展開安全的情況。例如,如果 &mut T 被捕獲,編譯器將生成一個警告,表明它不是展開安全的。但是,如果特別考慮了展開安全性,由於 catch_unwind 的特定用法,這實際上可能不是一個問題。這個包裝結構對於變量確實是展開安全的快速和輕量級注釋很有用。

例子

使用AssertUnwindSafe 的一種方法是斷言整個閉包本身是展開安全的,繞過對所有變量的所有檢查:

use std::panic::{self, AssertUnwindSafe};

let mut variable = 4;

// This code will not compile because the closure captures `&mut variable`
// which is not considered unwind safe by default.

// panic::catch_unwind(|| {
//     variable += 3;
// });

// This, however, will compile due to the `AssertUnwindSafe` wrapper
let result = panic::catch_unwind(AssertUnwindSafe(|| {
    variable += 3;
}));
// ...

包裝整個閉包相當於一個籠統的斷言,即所有捕獲的變量都是安全的。這樣做的缺點是,如果將來添加新的捕獲,它們也將被認為是安全的。因此,您可能更喜歡僅包裝單個捕獲,如下所示。這是更多的注釋,但它確保如果添加了一個不安全的新捕獲,那麽您將在那時得到一個編譯錯誤,這將允許您考慮該新捕獲是否實際上代表一個錯誤。

use std::panic::{self, AssertUnwindSafe};

let mut variable = 4;
let other_capture = 3;

let result = {
    let mut wrapper = AssertUnwindSafe(&mut variable);
    panic::catch_unwind(move || {
        **wrapper += other_capture;
    })
};
// ...

元組字段

0: T

相關用法


注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Struct std::panic::AssertUnwindSafe。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。