当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。