2.7 KiB
scopeguard
Rust crate for a convenient RAII scope guard that will run a given closure when it goes out of scope, even if the code between panics (assuming unwinding panic).
The defer!
macro and guard
are no_std
compatible (require only core
),
but the on unwinding / not on unwinding strategies require linking to std
.
By default, the use_std
crate feature is enabled. Disable the default features
for no_std
support.
Please read the API documentation here.
Minimum supported Rust version: 1.20
How to use
#[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();
}
Recent Changes
-
1.2.0
- Use ManuallyDrop instead of mem::forget in into_inner. (by @willtunnels)
- Warn if the guard is not assigned to a variable and is dropped immediately instead of at the scope's end. (by @sergey-v-galtsev)
-
1.1.0
- Change macros (
defer!
,defer_on_success!
anddefer_on_unwind!
) to accept statements. (by @konsumlamm)
- Change macros (
-
1.0.0
-
Change the closure type from
FnMut(&mut T)
toFnOnce(T)
: Passing the inner value by value instead of a mutable reference is a breaking change, but allows the guard closure to consume it. (by @tormol) -
Add
defer_on_success!
,guard_on_success()
andOnSuccess
strategy, which triggers when scope is exited without panic. It's the opposite todefer_on_unwind!
/guard_on_unwind()
/OnUnwind
. -
Add
ScopeGuard::into_inner()
, which "defuses" the guard and returns the guarded value. (by @tormol) -
Implement
Sync
for guards with non-Sync
closures. -
Require Rust 1.20
-
-
0.3.3
- Use
#[inline]
on a few more functions by @stjepang (#14) - Add examples to crate documentation
- Use
-
0.3.2
- Add crate categories
-
0.3.1
- Add
defer_on_unwind!
,Strategy
trait - Rename
Guard
→ScopeGuard
- Add
ScopeGuard::with_strategy
. ScopeGuard
now implementsDebug
.- Require Rust 1.11
- Add
-
0.2.0
- Require Rust 1.6
- Use
no_std
unconditionally - No other changes
-
0.1.2
- Add macro
defer!
- Add macro