本文简要介绍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 AsFd.as_fd用法及代码示例
- Rust AsHandle.as_handle用法及代码示例
- Rust AsMut用法及代码示例
- Rust AsRawFd.as_raw_fd用法及代码示例
- Rust AsciiExt用法及代码示例
- Rust AsRef用法及代码示例
- Rust AtomicU8.fetch_sub用法及代码示例
- Rust AtomicPtr.compare_exchange_weak用法及代码示例
- Rust AtomicU32.fetch_min用法及代码示例
- Rust AtomicI8.fetch_or用法及代码示例
- Rust AtomicI8.as_mut_ptr用法及代码示例
- Rust AtomicU8.fetch_or用法及代码示例
- Rust AtomicUsize.load用法及代码示例
- Rust AtomicI16.fetch_min用法及代码示例
- Rust AtomicI16.fetch_and用法及代码示例
- Rust AtomicU16.into_inner用法及代码示例
- Rust AtomicI16.fetch_nand用法及代码示例
- Rust AtomicI32.compare_exchange用法及代码示例
- Rust AtomicU16.from_mut用法及代码示例
- Rust AtomicI16.swap用法及代码示例
- Rust AtomicU8.as_mut_ptr用法及代码示例
- Rust AtomicBool.fetch_update用法及代码示例
- Rust AtomicU32.fetch_max用法及代码示例
- Rust AtomicI64.from_mut用法及代码示例
- Rust Arc.assume_init用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Struct std::panic::AssertUnwindSafe。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。