10个版本 (3个稳定版)
使用旧的Rust 2015
1.2.0 | 2023年7月17日 |
---|---|
1.1.0 | 2020年2月16日 |
1.0.0 | 2018年12月19日 |
0.3.3 | 2017年10月13日 |
0.1.0 | 2015年4月30日 |
2 in #panic
10,120,386 每月下载量
在31,326 个crate中使用 (直接使用239个)
22KB
263 行
scopeguard
Rust crate,提供方便的RAII作用域守护者,当它超出作用域时将执行给定的闭包,即使代码在panic之间(假设正在展开panic)。
宏defer!
和guard
与no_std
兼容(只需要core
),但展开/不展开策略需要链接到std
。默认情况下,启用了use_std
crate功能。禁用默认功能以支持no_std
。
请在此处阅读API文档。
最低支持的Rust版本:1.20
如何使用
#[macro_use(defer)]
extern crate scopeguard;
use scopeguard::guard;
fn f() {
defer! {
println!("Called at return or panic");
}
panic!();
}
use std::fs::File;
use std::io::Write;
fn g() {
let f = File::create("newfile.txt").unwrap();
let mut file = guard(f, |f| {
// write file at return or panic
let _ = f.sync_all();
});
// access the file through the scope guard itself
file.write_all(b"test me\n").unwrap();
}
近期更改
-
1.2.0
- 在into_inner中使用ManuallyDrop而不是mem::forget。 (by @willtunnels)
- 如果守护者没有分配给变量而是立即被丢弃,则发出警告。 (by @sergey-v-galtsev)
-
1.1.0
- 更改宏(
defer!
、defer_on_success!
和defer_on_unwind!
)以接受语句。 (by @konsumlamm)
- 更改宏(
-
1.0.0
-
将闭包类型从
FnMut(&mut T)
更改为FnOnce(T)
:通过值传递内部值而不是可变引用是一个破坏性变更,但允许守护者闭包消费它。 (by @tormol) -
添加
defer_on_success!
、guard_on_success()
和OnSuccess
策略,在作用域退出时没有panic的情况下触发。这是defer_on_unwind!
/guard_on_unwind()
/OnUnwind
的对立面。 -
添加
ScopeGuard::into_inner()
,它“解除”了守卫并返回受保护的值。(由 @tormol 提供) -
为具有非
Sync
封闭的守卫实现Sync
。 -
需要 Rust 1.20
-
-
0.3.3
- 通过 @stjepang 在更多函数上使用
#[inline]
(#14) - 为 crate 文档添加示例
- 通过 @stjepang 在更多函数上使用
-
0.3.2
- 添加 crate 类别
-
0.3.1
- 添加
defer_on_unwind!
,Strategy
特性 - 将
Guard
重命名为ScopeGuard
- 添加
ScopeGuard::with_strategy
。 ScopeGuard
现在实现了Debug
。- 需要 Rust 1.11
- 添加
-
0.2.0
- 需要 Rust 1.6
- 无条件使用
no_std
- 没有其他更改
-
0.1.2
- 添加宏
defer!
- 添加宏