scopeguard

Struct ScopeGuard

source
pub struct ScopeGuard<T, F, S = Always>
where F: FnOnce(T), S: Strategy,
{ /* private fields */ }
Expand description

ScopeGuard is a scope guard that may own a protected value.

If you place a guard in a local variable, the closure can run regardless how you leave the scope — through regular return or panic (except if panic or other code aborts; so as long as destructors run). It is run only once.

The S parameter for Strategy determines if the closure actually runs.

The guard’s closure will be called with the held value in the destructor.

The ScopeGuard implements Deref so that you can access the inner value.

Implementations§

source§

impl<T, F, S> ScopeGuard<T, F, S>
where F: FnOnce(T), S: Strategy,

source

pub fn with_strategy(v: T, dropfn: F) -> ScopeGuard<T, F, S>

Create a ScopeGuard that owns v (accessible through deref) and calls dropfn when its destructor runs.

The Strategy decides whether the scope guard’s closure should run.

source

pub fn into_inner(guard: Self) -> T

“Defuse” the guard and extract the value without calling the closure.

extern crate scopeguard;

use scopeguard::{guard, ScopeGuard};

fn conditional() -> bool { true }

fn main() {
    let mut guard = guard(Vec::new(), |mut v| v.clear());
    guard.push(1);

    if conditional() {
        // a condition maybe makes us decide to
        // “defuse” the guard and get back its inner parts
        let value = ScopeGuard::into_inner(guard);
    } else {
        // guard still exists in this branch
    }
}

Trait Implementations§

source§

impl<T, F, S> Debug for ScopeGuard<T, F, S>
where T: Debug, F: FnOnce(T), S: Strategy,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<T, F, S> Deref for ScopeGuard<T, F, S>
where F: FnOnce(T), S: Strategy,

source§

type Target = T

The resulting type after dereferencing.
source§

fn deref(&self) -> &T

Dereferences the value.
source§

impl<T, F, S> DerefMut for ScopeGuard<T, F, S>
where F: FnOnce(T), S: Strategy,

source§

fn deref_mut(&mut self) -> &mut T

Mutably dereferences the value.
source§

impl<T, F, S> Drop for ScopeGuard<T, F, S>
where F: FnOnce(T), S: Strategy,

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
source§

impl<T, F, S> Sync for ScopeGuard<T, F, S>
where T: Sync, F: FnOnce(T), S: Strategy,

Auto Trait Implementations§

§

impl<T, F, S> Freeze for ScopeGuard<T, F, S>
where T: Freeze, F: Freeze,

§

impl<T, F, S> RefUnwindSafe for ScopeGuard<T, F, S>

§

impl<T, F, S> Send for ScopeGuard<T, F, S>
where T: Send, F: Send,

§

impl<T, F, S> Unpin for ScopeGuard<T, F, S>
where T: Unpin, F: Unpin,

§

impl<T, F, S> UnwindSafe for ScopeGuard<T, F, S>
where T: UnwindSafe, F: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.